2015-04-11 3 views
1

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

public bool Can_access_to_file(string FileIsAccesible_file) 
{ 
    try { 
     System.IO.FileStream Stream = new System.IO.FileStream(FileIsAccesible_file, System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite); 
     Stream.Close(); 
     return true; 
    } catch { 
     return false; 
    } 
} 

У меня есть некоторые сомнения по этому поводу, кажется, не очень хорошо потому что он устанавливает поток файлов, а это значит, что для больших файлов потребуется столько времени, чтобы проверить, не так ли?

Что мне делать, чтобы улучшить его?

Пожалуйста, поставьте или объясните лучшее решение, чем мой текущий код.

+1

За исключением того, что он обертывает его в используемом заявлении, мне кажется, что это хорошо. –

ответ

1

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

Поскольку вы только открываете и закрываете и не указали размер буфера (поэтому по умолчанию), вы только всегда читаете первые 4096 байт файла.

Если вы не хотите, чтобы обернуть в использовании заявление, но все же убедитесь, что вы убирать за собой, звоните Stream.Dispose() после вызова Stream.Close()

+1

его трудно выбрать между этим ответом или ответом Марио, но это то, что мне нужно подробное объяснение того, как он работает над этим кодом, чтобы знать, является ли использование потока лучшим или, по крайней мере, хорошим решением. благодаря – Meska

1

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

/// <summary> 
/// check whether a file can be accessed 
/// --> Warning: No lock is performed, so things may change until you really access the file 
/// </summary> 
/// <param name="fullFilename">name of the file</param> 
/// <returns>true if the fle can be accessed, false in any other case</returns> 
public static bool CanOpenExclusive(string fullFilename) 
{ 
    Contract.Requires(false == String.IsNullOrWhiteSpace(fullFilename), "fullFilename is required but is not given"); 

    try 
    { 
     using (FileStream stream = File.Open(fullFilename, FileMode.Open, FileAccess.Read, FileShare.None)) 
     { 
      return true; 
     } 
    } 
    catch(IOException) 
    { 
     return false; 
    } 
} 
Смежные вопросы