2013-08-23 2 views
-1

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

Процесс не может получить доступ к файлу .Это используется другим процессом.

string target_dir="D:\\projectpath\\page"; 
if (Directory.Exists(target_dir)) 
Directory.Delete(target_dir, false); 

Как устранить эту ошибку?

+9

Существует открытый файл, который находится в этом каталоге, он должен быть закрыт для этого. – OneFineDay

+1

Не является ли сообщение об исключительной ошибке? –

ответ

4

Похоже, файл заблокирован каким-либо другим процессом. Это может произойти, если при чтении/записи вы забыли утилизировать устройство чтения/записи потока, и вы удалили неуправляемого обработчика в файл.

Например, если вы использовали следующий код для чтения из файла:

StreamReader reader = new StreamReader(fileName); 
string contents = reader.ReadToEnd(); 

и вы никогда не освободить читателя, файл будет заблокирован. Правильный путь, чтобы обернуть IDisposable ресурсов, такие как потоки и StreamReaders при помощи операторов:

using (StreamReader reader = new StreamReader(fileName)) 
{ 
    string contents = reader.ReadToEnd(); 
} 

Если с другой стороны, файл заблокирован каким-либо другим внешним процессом в приложение, то есть очень мало вы можете с этим поделать , кроме убийства этого процесса.

0

Чтобы удалить диалект, вы должны иметь правильные разрешения.

var target_dir = "D:\\projectpath\page"; 
    var isWriteAccess = false; 
    try 
    { 
    var collection = Directory.GetAccessControl(target_dir) 
     .GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount)); 
    if (collection.Cast<FileSystemAccessRule>().Any(rule => rule.AccessControlType == AccessControlType.Allow)) 
    { 
     isWriteAccess = true; 
    } 
    } 
    catch (UnauthorizedAccessException ex) 
    { 
    isWriteAccess = false; 
    } 
    catch (Exception ex) 
    { 
    isWriteAccess = false; 
    } 

    if (!isWriteAccess) 
    { 
    MessageBox.Show("no access to directory."); 
    // Handle here close and kill the blocking process 

    } 
    else 
    { 
     Directory.Delete(target_dir, false); 
    } 
} 
+0

Честно говоря, я не думаю, что это проблема с разрешением, так как в результате ошибки появляется следующее сообщение: «Процесс не может получить доступ к файлу .it используется другим процессом». – sockfd

+0

Да, но это означает, что у вас нет разрешения на запись в дикторию по любой причине! Прежде всего, вы должны определить, можете ли вы удалить этот файл, и если вы можете, а не просто удалить еще искать причину, если другой блок процесса, чем убить его, если стример все еще использует файл, чем закрыть его и т. Д. –

2

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

Если вы должны удалить файл, вы можете взглянуть на:

Using C#, how does one figure out what process locked a file?

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