Подтвердить что ты не робот

Невероятная проблема со временем создания файла

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

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

Проблема, которая действительно меня озадачивает, заключается в том, что вновь созданный файл ошибочно "создал" -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();
    }
4b9b3361

Ответ 1

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

Windows NT содержит возможности туннелирования файловой системы (Архив)

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

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

Ответ 2

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

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

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

Ответ 3

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