Невероятно странная проблема времени создания файла - PullRequest
23 голосов
/ 21 января 2010

У меня действительно очень странная проблема! Интересно, проблема в фреймворке, ОС или, может быть, это только у меня, непонимание вещей ...

У меня есть файл, который может быть создан очень давно, я использую этот файл, а затем хочу заархивировать его, изменив его имя. Затем я хочу создать новый файл с тем же именем, что и у старого файла, прежде чем он будет переименован. Достаточно просто!

Проблема, которая действительно озадачивает меня, состоит в том, что вновь созданный файл неправильно создает "timestamp"! Это проблема, поскольку именно эту временную метку я хочу использовать для определения того, когда архивировать и создавать новый файл.

Я создал очень маленький образец, который показывает проблему. Чтобы образец работал, в папке «Файлы» должен быть файл 1.txt. Кроме того, атрибут файла также должен быть установлен во времени (с одним из доступных инструментов, я использую Nomad.NET).

    static void Main(string[] args)
    {
        // Create a directory, if doesnt exist.
        string path = Path.GetDirectoryName(Application.ExecutablePath) + "\\Files";
        Directory.CreateDirectory(path);

        // Create/attach to the 1.txt file
        string filename = path + "\\1.txt";
        StreamWriter sw = File.AppendText(filename);
        sw.WriteLine("testing");
        sw.Flush();
        sw.Close();
        // Rename it...
        File.Move(filename, path + "\\2.txt");

        // Create a new 1.txt
        sw = File.AppendText(filename);
        FileInfo fi = new FileInfo(filename);
        // Observe, the old files creation date!!
        Console.WriteLine(String.Format("Date: {0}", fi.CreationTime.Date));

        Console.ReadKey();
    }

Ответы [ 3 ]

27 голосов
/ 21 января 2010

Это результат мистической «фишки», восходящей к старым временам Windows. Основные детали здесь:

По сути, это специально. Но он настраивается и является анахронизмом в большинстве современных программ.

Я думаю вы можете сначала создать новое имя файла, затем переименовать old-> old.1, затем new-> old, и это будет "работать". Честно говоря, я не помню, что мы делали, когда столкнулись с этим последним несколько лет назад.

8 голосов
/ 13 июня 2011

Я недавно столкнулся с той же проблемой, описанной в вопросе. В нашем случае, если наш файл журнала старше недели, мы удаляем его и запускаем новый. Тем не менее, он сохраняет ту же дату, созданную с 2008 года.

Один ответ здесь описывает переименование старого файла, а затем создание нового с надеждой подобрать правильную дату создания. Однако это оказалось неудачным для нас, оно сохранило прежнюю дату.

Мы использовали метод File.SetCreationTime, и, как следует из его названия, он легко позволял нам контролировать дату создания файла, позволяя установить для него значение DateTime.Now. Впоследствии наша логика работала правильно.

2 голосов
/ 14 марта 2013

File.SetCreationTime ("файл", DateTime.Now);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...