2013-05-23 3 views
1

Я написал программу и нуждаюсь в моем собственном наблюдателе файлов (цикл, который проверяет, можно ли открыть файл). Что-то вроде этого:Как проверить, открыт ли файл?

while (loadedFiles.Count > 0 || isNeedReRead) 
{ 
    Thread.Sleep(1000); 
    if (isNeedReRead) 
     ReadFromRegistry(); 

    foreach (var file in loadedFiles) 
    { 
     if (!IsFileLocked(file.Value)) 
     { 
       // logic 
     } 
    } 
} 

Источник: Is there a way to check if a file is in use?

Вот мое решение:

try 
{ 
    using (Stream stream = new FileStream(
     path, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) 
    { 
     stream.Close(); 
     return false; 
    } 
} 
catch (IOException) 
{ 
    return true; 
} 

Он отлично работает с Word, Excel. Но если процесс не блокирует файл, этот метод не помогает. Например, если файл с открытым растровым изображением изменяется, IsFileLocked возвращает false.

Любые идеи?

+0

Будет ли уведомление, если изменения файла будут приемлемыми? Если это так, вы можете использовать класс System.IO.FileSystemWatcher. –

+0

Для чего это будет полезно? Даже если вы проверите, что файл можно открыть, нет никакой гарантии, что он все равно может быть открыт, когда вы действительно попытаетесь его открыть, даже если это самая следующая строка кода. Вам все равно придется обернуть доступ к файлу в «try-catch». – JosephHirn

+0

Я не могу использовать FileSystemWatcher. Он уведомляет, когда файл изменен. Мне нужно уведомление OnClosed. Моя программа содержит некоторые файлы. И когда я открываю некоторые из них, мой наблюдатель начинает бежать. Когда файл закрыт, наблюдатель обновляет его, если это необходимо. Но я могу закрыть программу перед закрытым файлом. В этом случае наблюдатель запускается при загрузке программы и проверяет все ранее открытые файлы. Если этот файл не открывается, он обновляется. – Max

ответ

2

Вы можете настроить мониторинг файла с помощью System.IO.FileSystemWatcher, вы должны иметь возможность использовать свойство NotifyFilter (установлено значение LastAccessTime), чтобы определить, когда последний доступ к файлу был последним.

void SetupWatcher() 
{ 
    // Create a new FileSystemWatcher and set its properties. 
     FileSystemWatcher watcher = new FileSystemWatcher(); 
     watcher.Path = @"C:\"; 
    /* Watch for changes in LastAccess and LastWrite times, and 
     the renaming of files or directories. */ 
    watcher.NotifyFilter = NotifyFilters.LastAccess; 

    // Only watch text files. 
    watcher.Filter = "*.txt"; 

    // Add event handlers. 
    watcher.Changed += new FileSystemEventHandler(OnChanged); 
    watcher.Created += new FileSystemEventHandler(OnChanged); 
    watcher.Deleted += new FileSystemEventHandler(OnChanged); 
    watcher.Renamed += new RenamedEventHandler(OnRenamed); 

     // Begin watching. 
     watcher.EnableRaisingEvents = true; 
} 

// Define the event handlers. 
    private static void OnChanged(object source, FileSystemEventArgs e) 
    { 
     // Specify what is done when a file is changed, created, or deleted. 
     Console.WriteLine("File: " + e.FullPath + " " + e.ChangeType); 
    } 

private static void OnRenamed(object source, RenamedEventArgs e) 
{ 
    // Specify what is done when a file is renamed. 
    Console.WriteLine("File: {0} renamed to {1}", e.OldFullPath, e.FullPath); 
} 

Другой вариант, предполагающий, что это окна, состоит в перечислении списка открытых файлов для каждого процесса. Код размещен here имеет приличную реализацию так все, что вам нужно сделать, это позвонить

DetectOpenFiles.GetOpenFilesEnumerator(processID); 

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

+0

Я не могу использовать FileSystemWatcher. См. Комментарий ниже вопроса. – Max

+0

Но «DetectOpenFiles.GetOpenFilesEnumerator (processID)»; Мне нравится. Я попробую это. – Max

+0

@Max Обновлен ответ, чтобы включить возможность обнаружения списка открытых дескрипторов файлов. –

Смежные вопросы