2016-10-25 17 views
2

Некоторые программы (такие графические программы, как Paint, текстовые редакторы, такие как блокнот и Wordpad, и другие) открывают файлы, загружают содержимое в память, а затем освобождают блокировку файлов. Есть ли способ определить, использует ли программа этот файл, даже если он не заблокирован?Проверьте, открыт ли файл, который не заблокирован

Например, даже если image1.bmp открыт в Paint, моя программа может перезаписать копию image1.bmp, которая находится на диске, потому что файл не заблокирован. Теперь копия image1.bmp, которая открыта в Paint, отличается от копии image1.bmp, которая находится на диске.

Моя программа написана на C#. Обычно я использую этот метод для проверки того, заблокирован ли файл, но в этом случае он не будет работать. Is there a way to check if a file is in use?

Есть ли какие-либо решения?

+1

Возможный дубликат http://stackoverflow.com/questions/876473/is-there-a-way-to-check-if-a-file -is-in-use – Jules

+0

Я ссылался на эту ссылку выше. Это решение работает только в том случае, если файл заблокирован – JohnRL

+0

ОК, это лучше – Jules

ответ

0

«Теперь копия image1.bmp, которая открыта в Paint» - вот ваша ошибка - файл больше не открывается в Paint. Он был открыт, прочитан, а затем закрыт. Paint не оставляет файл открытым вообще - он имеет только КОПИЮ его содержимого в ОЗУ. Иначе говоря, факт, что вы видите изображение в MS Paint, не означает, что файл открыт.

Это сопоставимо с предоставлением документа кому-либо, затем он делает фотокопию и возвращает ее - этот человек больше не «держит» документ, у него есть отдельная его копия. И нет способа, просто взглянув на документ, чтобы узнать, кто мог бы сделать его копию в какой-то момент истории.

Другой способ поместить это этот псевдокод:

File file = Open("image.png"); 
Image img = ImageFromFile(file); 
file.Close(); 

... 

img.Save("image.png"); 

Здесь файл не открывается вообще, есть только копия в памяти ее содержание.

Примечание: Я действительно проверил, что для Paint - Process Explorer может показать вам открытые дескрипторы, я открыл файл в Paint и не было никакого дескриптора, указанного в файле этого имени.

0

Вот что я придумал. Я проверяю все открытые процессы на заголовок окна. Если у процесса есть заголовок окна, я вижу, содержит ли он имя файла, который я ищу.

Он не будет работать в течение 100% времени, поскольку некоторые приложения могут открывать несколько файлов в одном экземпляре.

Я приспособил его от этого вопроса: Getting a list of all applications

 bool isFileOpen(string file) 
      {  
      string windowTitle = ""; 


      Process[] myProcesses = Process.GetProcesses(); 

      foreach (Process P in myProcesses) 
      { 
       if (P.MainWindowTitle.Length > 1) 
       { 
        windowTitle = P.MainWindowTitle; 
        if (windowTitle.Contains(file) == true) 
        { 
         return true;       
        }      
       } 

      } 
      return false; 

     }