Лучший способ обработки ошибок при открытии файла - PullRequest
1 голос
/ 29 февраля 2012

Обработка файлов (открытие) - это занятие, особенно подверженное ошибкам.

Если бы вы написали функцию для этого (хотя бы тривиально), как лучше написать ее при обработке ошибок?

Хорошо ли следующее?

if (File.Exists(path))
{ 
    using (Streamwriter ....)
    { // write code }
}

else
// throw error if exceptional else report to user

Будет ли вышеупомянутое (хотя и не синтаксически правильным) хорошим способом сделать это?

Ответы [ 3 ]

4 голосов
/ 29 февраля 2012

Доступ к внешним ресурсам всегда подвержен ошибкам. Используйте блок try catch для управления доступом к файловой системе и управления обработкой исключений (наличие пути / файла, права доступа к файлу и т. Д.)

3 голосов
/ 29 февраля 2012

Сначала вы можете проверить, есть ли у вас доступ к файлу, после, если файл существует, и между созданием потока используйте блок try catch, посмотрите:

public bool HasDirectoryAccess(FileSystemRights fileSystemRights, string directoryPath)
{
    DirectorySecurity directorySecurity = Directory.GetAccessControl(directoryPath);

    foreach (FileSystemAccessRule rule in directorySecurity.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount)))
    {
        if ((rule.FileSystemRights & fileSystemRights) != 0)
        {
            return true;
        }
    }

    return false;
}

Итак:

if (this.HasDirectoryAccess(FileSystemRights.Read, path)
{
    if (File.Exists(path))   
    {  
        try
        {      
            using (Streamwriter ....)       
            { 
                // write code 
            }   
        }
        catch (Exception ex)            
        {    
            // throw error if exceptional else report to user or treat it                          
        } 
    }      
    else
    {
        // throw error if exceptional else report to user   
    }
}

Или вы можете проверить все с помощью try catch и создать поток внутри try catch.

1 голос
/ 29 февраля 2012

Вы можете использовать что-то вроде этого

    private bool CanAccessFile(string FileName)
    {
        try
        {
            var fileToRead = new FileInfo(FileName);
            FileStream f = fileToRead.Open(FileMode.Open, FileAccess.Read, FileShare.None);
            /*
                 * Since the file is opened now close it and we can access it
                 */
            f.Close();
            return true;
        }
        catch (Exception ex)
        {
            Debug.WriteLine("Cannot open " + FileName + " for reading. Exception raised - " + ex.Message);
        }

        return false;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...