AFAIK в файле нет специальной метки, указывающей на то, что он копируется, кроме того, что он будет иметь блокировку записи.В этой ситуации стандартной практикой является попытка самостоятельно открыть файл с блокировкой записи (например, FileShare.Read) и перехватить любое исключение IOException, возникающее из-за того, что файл уже заблокирован;в этом случае немного подождите (Thread.Sleep) перед повторной попыткой открыть файл.Возможно, вы захотите ограничить количество повторных попыток (чтобы предотвратить бесконечный цикл в случае, если существующая блокировка файла никогда не снимается).
Вы говорите, что хотите обработать файлы, а затем удалить их?Чтобы избежать гонки с другим процессом / потоком, записывающим в тот же файл во время его обработки / удаления его, вы должны рассматривать свою обработку / удаление как элементарную операцию, например, что-то вроде этого:
string sourcePath = @"C:\temp1\temp.txt";
string targetPath = @"C:\temp2\temp.txt";
int attempt = 0;
const int maxAttempts = 3;
bool moved = false;
do
{
try
{
File.Move(sourcePath, targetPath);
moved = true;
}
catch (IOException)
{
if (attempt < maxAttempts)
{
System.Threading.Thread.Sleep(1000);
attempt++;
}
}
} while (!moved && attempt < maxAttempts);
if (moved)
{
ProcessFile(targetPath);
File.Delete(targetPath);
}
else
{
throw new InvalidOperationException("Unable to process '" + sourcePath + "'.");
}
Edit: я вижу, вы говорите, что файлы могут быть очень большими, поэтому вы не должны использовать File.ReadAllText.Вместо этого вы можете попытаться переместить файлы в другой каталог - это вызовет исключение, если файл все еще заблокирован другим процессом.Вы обрабатываете файл, только если успешно переместите его.Это также имеет преимущество удаления файла из входного каталога.