2016-01-28 3 views
2

Я пытаюсь удалить файл на C#, однако получаю сообщение о том, что файл используется из другого процесса. Я хочу, чтобы проверить, существуют ли файлы и закрыть их. Я использую следующую функцию для того, чтобы проверить, если файл открыт:Файл используется другим процессом в C#

public static bool IsFileInUse(string path) 
    { 
     if (string.IsNullOrEmpty(path)) 
      throw new ArgumentException("'path' cannot be null or empty.", "path"); 

     try 
     { 
      using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read)) { } 
     } 
     catch (IOException) 
     { 
      return true; 
     } 

     return false; 
} 

и я пытаюсь, когда файл используется, чтобы закрыть его:

bool checking = IsFileInUse(file); 
File.Create(file).Close(); 
if (File.Exists(file)) 
{ 
     File.Delete(file); 
} 

Я получил проблемы в файле. Создайте линию, я получаю сообщение:

Файл используется другим процессом.

EDIT: Я пытаюсь использовать стопорный подход для того, чтобы удалить файл. Я полагаю, чтобы удалить файл внутри оператора блокировки? Как правильно использовать оператор блокировки?

+0

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

+0

Поэтому я должен убить процесс, чтобы закрыть файл, не так ли? –

+1

Это ваше приложение? Если да, то вы можете отправить сообщение, чтобы освободить его или использовать блокировку между процессами. – Adil

ответ

4

Почему вы предполагаете, что операция чтения не удастся, если файл используется, когда операция записи не будет? File.Create() потерпит неудачу точно как новый FileStream() не удалось до ...

См. Также IOException: The process cannot access the file 'file path' because it is being used by another process.

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

Чтобы закрыть открытый файл, он может быть действительно разрушительным для другого процесса, он может сбой, прекрасно справиться с проблемой или ... что-нибудь еще (тихо игнорировать эту ошибку и производить произвольный вывод, снова открывать файл и т. Д.). .) Можно ли сделать это на C#? Да с некоторыми P/Invoke ...

1) Давайте найдем ручку для файла, который вы хотите, разблокировать. Используйте NtQuerySystemInformation() и перечислите все дескрипторы, пока не найдете тот, который ссылается на этот файл.

2) Дублируйте этот дескриптор в своем собственном процессе, используя DuplicateHandle().

3) Закрыть просто создать дескриптор, указав DUPLICATE_CLOSE_SOURCE, он закроет как ваш дескриптор, так и оригинальный (конечно, если у вашего процесса достаточно разрешений).

4) Проверьте, действительно ли файл действительно закрыт, с вызовом NtQuerySystemInformation(), если нет, то вам может потребоваться прямо закрыть его родительский процесс.

2

У вас нет необходимости в проверки если файл существует, просто попробуйте сделать удалить это:

https://msdn.microsoft.com/en-us/library/system.io.file.delete(v=vs.110).aspx

Если файл должен быть удален, не существует, исключение не выбрасывается ,

Try и проверить исключение

try { 
    File.Delete(file); 
    } 
    catch (IOException) { 
    // File in use and can't be deleted; no permission etc. 
    } 
+2

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

0

В вашем коде, вы что-нибудь с результатом IsFileInUse не делать.

Этот File.Create(file).Close(); также не закрывает файл, открытый другим процессом. Вам нужно закрыть процесс, в котором файл открыт, и если это ваше собственное приложение, закройте дескриптор файла, прежде чем пытаться удалить файл.

bool checking = IsFileInUse(file); 
File.Create(file).Close(); 
if (!checking) 
{ 
    if (File.Exists(file)) 
    { 
      File.Delete(file); 
    } 
} 
+0

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

+0

@JoseRamon вы можете это сделать (закрыть этот процесс, [после того, как вы его нашли] (http://stackoverflow.com/a/35058113/1207195)), но это что-то делать осторожно. –

+0

Является ли это способом закрыть поток https://msdn.microsoft.com/en-US/library/7a2f3ay4(v=vs.80).aspx? –

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