от
На этот вопрос уже есть ответ здесь: Есть ли способ проверить, если файл используется? 17 ответов Есть ли способ проверить, является ли файл заблокирован, не используя try/catch блок? Прямо сейчас, единственный способ я знаю, чтобы просто открыть файл и поймать любую
System.IO.IOException
.

Ваш ответ

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

13 Ответы

0 голосов
от
На этот вопрос уже есть ответ здесь: Есть ли способ проверить, если файл используется? 17 ответов Есть ли способ проверить, является ли файл заблокирован, не используя try/catch блок? Прямо сейчас, единственный способ я знаю, чтобы просто открыть файл и поймать любую
System.IO.IOException
.
0 голосов
от
Нет, к сожалению, и если вы думаете об этом, эта информация будет в любом случае бесполезными, так как файл может быть заблокирована уже на следующий второй (читай: короткие сроки). Почему конкретно вы должны знать, если файл все равно закрыта? Зная, что может дать нам какой-то другой способ дать вам хороший совет. Если ваш код будет выглядеть так:
if not locked then
    open and update file
Затем между двумя линиями, другой процесс может легко заблокировать файл, давая вам с той же проблемой вы пытались избежать начнем с того: исключения.
0 голосов
от
Когда я столкнулся с подобной проблемой, я закончил следующим кодом:
public bool IsFileLocked(string filePath)
{
    try
    {
        using (File.Open(filePath, FileMode.Open)){}
    }
    catch (IOException e)
    {
        var errorCode = Marshal.GetHRForException(e)
0 голосов
от
Других ответов полагаться на старую информацию. Это обеспечивает лучшее решение. Давно это было невозможно, чтобы надежно получить список процессов блокировку файла, так как Windows просто не отслеживать эту информацию. В поддержку перезапуска API диспетчера, эта информация сейчас отслеживаются. Перезапуск API диспетчера доступна начиная с Windows Vista и Windows Server 2008 (с перезагрузите менеджера: выполнения требования). Я собрал код, который принимает путь к файлу и возвращает
List
0 голосов
от
Вы также можете проверить, если какой-либо процесс использует этот файл и покажет список программ, которые необходимо закрыть для продолжения как установщик работает.
public static string GetFileProcessName(string filePath)
{
    Process[] procs = Process.GetProcesses();
    string fileName = Path.GetFileName(filePath);

    foreach (Process proc in procs)
    {
        if (proc.MainWindowHandle != new IntPtr(0)
0 голосов
от
Вместо использования взаимодействия можно использовать .Чистый поток FileStream класс методы LOCK и Unlock: Типа FileStream.Замок http://msdn.microsoft.com/en-us/library/system.io.filestream.lock.aspx Типа FileStream.Разблокировка http://msdn.microsoft.com/en-us/library/system.io.filestream.unlock.aspx
0 голосов
от
Вы могли бы назвать файл через взаимодействие в области файла, который вас интересует. Это не будет бросать исключение, если это удастся, вы будете иметь блокировку на ту часть файла (который проводит свой процесс), что замок будет проводиться, пока вы называете UnlockFile или ваш процесс умирает.
0 голосов
от
Вариация отличный ответ DixonD (см. выше).
public static bool TryOpen(string path,
                           FileMode fileMode,
                           FileAccess fileAccess,
                           FileShare fileShare,
                           TimeSpan timeout,
                           out Stream stream)
{
    var endTime = DateTime.Now   timeout;

    while (DateTime.Now
0 голосов
от
Вот вариант кода DixonD, что добавляет количество секунд ожидания на файл, чтобы разблокировать и попробуйте снова:
public bool IsFileLocked(string filePath, int secondsToWait)
{
    bool isLocked = true;
    int i = 0;

    while (isLocked
0 голосов
от
Затем между двумя линиями, другой процесс может легко заблокировать файл, давая вам с той же проблемой вы пытались избежать начнем с того: исключения. Однако, таким образом, вы бы знали, что проблема является временной, и, чтобы повторить попытку позже. (Напр., вы могли бы написать что-нить, что в случае возникновения блокировки при попытке писать, продолжает попытки, пока блокировка не пропала.) В исключительной ситуации IOException, с другой стороны, само по себе не является достаточно конкретным, что замок является причиной сбоя ввода-вывода. Могли быть причины, что не временные.
...