Как изменить временные метки каталогов при открытии File Explorer?C#

Место общения программистов C#
Anonymous
 Как изменить временные метки каталогов при открытии File Explorer?

Сообщение Anonymous »

Мое приложение создает файлы и каталоги в течение всего года, и ему необходимо получить доступ к временным меткам этих каталогов, чтобы определить, пришло ли время создать еще один. Поэтому жизненно важно, чтобы, когда я перемещаю каталог, я сохраняю его временные метки. Я могу сделать это так, когда Directory.move () < /code> не является опцией (например, при переходе на другой диск). < /P>

Код: Выделить всё

    FileSystem.CopyDirectory(sourcePath, targetPath, overwrite);

Directory.SetCreationTimeUtc  (targetPath, Directory.GetCreationTimeUtc  (sourcePath));
Directory.SetLastAccessTimeUtc(targetPath, Directory.GetLastAccessTimeUtc(sourcePath));
Directory.SetLastWriteTimeUtc (targetPath, Directory.GetLastWriteTimeUtc (sourcePath));

Directory.Delete(sourcePath, true);
< /code>

Однако все три из этих методов "Directory.set" не удастся, если Explorer File открыт, и, похоже, даже не имеет значения, является ли рассматриваемый каталог в настоящее время в исследователе файлов или нет (редактировать: я подозреваю, что это имеет что -то делать с быстрым доступом, но причина не особенно важна). Он бросает ioException < /code>, в котором говорится: «Процесс не может получить доступ к файлу 'c: \ myfolder', потому что он используется другим процессом». Есть ли альтернативный способ изменения временной метки, которая не бросает ошибку, когда открыт исследователь файлов? Должен ли я автоматически закрыть исследователь файлов? Или, если моему приложению просто нужно пройти неудачу, то я бы хотел потерпеть неудачу до того, как пройдут какие -либо операции с файлами. Есть ли способ заранее определить, если Directory.SetCreationTimeUTC () 
Например, будет встречаться с ioException ?

заранее. Вот какой -то пример кода, который вы можете использовать, чтобы попробовать воссоздать проблему: < /p>

Код: Выделить всё

using System;
using System.IO;

namespace CreationTimeTest
{
class Program
{
static void Main( string[] args )
{
try
{
DirectoryInfo di = new DirectoryInfo( @"C:\Test" );

di.CreationTimeUtc = DateTime.UtcNow;

Console.WriteLine( di.FullName + " creation time set to " + di.CreationTimeUtc );
}
catch ( Exception ex )
{
Console.WriteLine( ex );
//throw;
}

finally
{
Console.ReadKey( true );
}

}
}
}
< /code>

create c: \ test < /code>, build creationtimetest.exe и запустить его. Это происходит, если папка C: \ test 
была видна, потому что C: \ была расширена. Это означает, что марка Time может быть установлена ​​просто в порядке, если Explorer File Open и C: \ никогда не была расширена. Однако, как только C: \ test станет видимым в исследователе файлов, кажется, что это папка и не допускает никакой модификации марки времени даже после того, как C: \ обрушится. Может ли кто -нибудь воссоздать это? Есть два способа попытки установить время создания, которая может добавить исключение «Используется другим процессом». Первое - это открыть C: \ test на основной панели, но в этом случае вы можете отойти от C: \ test , а затем программа снова будет успешно работать. Но второй способ состоит в том, чтобы сделать C: \ test на панели навигации, то есть расширить C: \ . И как только вы это сделаете, кажется, что File Explorer сохраняет ручку открытой, потому что программа продолжает терпеть неудачу даже после того, как вы свернете C: \ < /code>, пока вы не закрываете Explorer. Наличие C: \ test быть видимым, не вызывает проблемы. C: \ test может быть видна на главной панели без проблем. Его видимость на панели навигации - это то, что имеет значение.

Подробнее здесь: https://stackoverflow.com/questions/460 ... er-is-open

Вернуться в «C#»