2017-01-25 11 views
2

У меня есть папка видео в определенном месте, скажем C: \ Temp.Доступны ли файлы при перемещении их каталога на другой?

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

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

TLDR; У меня есть два видео в папке, и я перемещаю их в другое место, одновременно пытаясь прочитать из этого каталога с другим потоком, возможно ли, что другой поток сможет получить доступ к каталогу, даже если копия еще не выполнена «?

+1

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

+1

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

+0

Тогда я задам другой вопрос: возможно ли переместить каталог, блокируя весь каталог до завершения копирования? –

ответ

1

Я не вижу причин, по которым вы не сможете получить доступ к папке, пока файлы из этого каталога перемещаются (разрешения в сторону ...). Если вы просматриваете папку и запускаете файл, который заблокирован из-за того, что он был скопирован/открыт другой программой, я использую ниже в качестве метода расширения для управления этим.

е = файл, с = текущая попытка, м = макс попытки

public static bool IsFileLocked(this FileInfo f, int c, int m) 
{ 
    if (c > m) { return true; } 
    FileStream fs = null; 
    try 
    { 
     fs = f.Open(FileMode.Open, FileAccess.Read, FileShare.None); 
    } 
    catch (IOException) 
    { 
     Thread.Sleep(500); 
     return IsFileLocked(f, c + 1, m); 
    } 
    finally 
    { 
     fs?.Close(); 
    } 
    return false; 
} 

В использовании

var f = new FileInfo(@"C:/Current/Path/To/File.txt"); 
if (f.IsFileLocked(0, 50)) { 
     //The file is locked.     
}