Я подумал о том, чтобы написать правку в ответ @BanMe, но кажется, что было бы лучше быть более всеобъемлющим в ответе, так как я бы эффективно добавил дополнительное изменение в его предлагаемое исправление (которое вна самом деле, это очень важно) после собственного тестирования.
Это было проверено и проверено на работу в моей системе.Было одно дополнительное изменение, которое я должен был сделать, чтобы заставить это работать более эффективно.Он включает в себя исправление команды Move
, Path.Combine
, но, что более важно, добавляет NotifyFilter
к FileName
.
Вы должны иметь возможность использовать этот раздел своего кода, и он долженработа, как и ожидалось от моего тестирования.
private void btstart_Click(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Minimized;
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = @"C:\test";
watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName;
watcher.Created += new FileSystemEventHandler(watcher_FileCreated);
watcher.EnableRaisingEvents = true;
}
public static bool Ready(string filename)
{
try
{
using (FileStream inputStream = File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.None))
return inputStream.Length > 0;
}
catch (Exception)
{
return false;
}
}
void watcher_FileCreated(object sender, FileSystemEventArgs e)
{
string path1 = @"C:\test";
string path2 = @"C:\test2";
string files = @"*.*";
string[] fileList = Directory.GetFiles(path1, files);
foreach (string file in fileList)
{
if (Ready(file) == true)
{
File.Move(file, Path.Combine(path2, System.IO.Path.GetFileName(file)));
}
}
}
Почему нам нужно расширить NotifyFilters
?Взгляните на этот ответ , который я подытожу соответствующей частью здесь:
У меня тоже были проблемы с этим поведением.Если вы пошагово просматриваете код (и если вы посмотрите документацию MSDN, вы обнаружите, что NotifyFilter запускается со значением по умолчанию:
NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.LastWrite
Поэтому, когда вы говорите .NotifyFilter = NotifyFilters.CreationTime, вы стираете эти другие значения, что объясняет разницу в поведении. Я не уверен, почему NotifyFilters.CreationTime не перехватывает новый файл ... похожедолжен, не должен ли!
Похоже, что вы изолировали NotifyFilter
от LastWrite
, игнорируя другие аспекты FileSystemWatcher
. Добавление в FileName
решило проблему для меня.
Вы по-прежнему можете вызвать исключение, если файлы уже существуют в папке C:\TEST2\
, но это очень простая настройка, которую можно выполнить до File.Move
, если необходимо.