Проверка, если файл уже используется перед открытием (сетевой диск, C #) - PullRequest
2 голосов
/ 17 декабря 2008

Существует ли в .Net какой-либо способ проверки перед открытием, если файл (на локальном сетевом диске) уже используется?

Ответы [ 6 ]

3 голосов
/ 17 декабря 2008

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

Но я не думаю, что существует какая-либо надежная мера для разграничения блокировки и сбоя разрешения (поскольку вы можете прочитать файл, но не сможете проверить разрешения). Даже в сообщении об ошибке Windows говорится, что у вас либо нет разрешения, либо он используется другим процессом.

Вы можете использовать класс WMI CIM_DataFile для запроса InUseCount для указанного файла данных.

Если вы ищете программный эквивалент утилиты lsof в Linux, чтобы узнать все открытые файлы по заданному локальному процессу, вы можете попробовать использовать Win32_Process класс WMI через System.Management пространство имен. Вы можете выполнить запрос WMI для поиска имени файла во всех открытых файлах, используемых всеми локальными процессами, а также посмотреть, есть ли оно там или нет. В качестве альтернативы вы можете использовать P / Invoke и напрямую использовать API NtQuerySystemInformation для выполнения той же задачи.

2 голосов
/ 17 декабря 2008
bool CanReadAndWrite(string path)
{
    var perm = new System.Security.Permissions.FileIOPermission(
         System.Security.Permissions.FileIOPermissionAccess.Write |
         System.Security.Permissions.FileIOPermissionAccess.Read,
         path);
    try
    {
         perm.Demand();
         return true;
    }
    catch 
    {
         return false;
    }
}

Проверяет, можете ли вы читать и писать в файл.

2 голосов
/ 17 декабря 2008

Это подойдет. FileShare.None как упомянуто в MSDN:

Нет: отклоняет общий доступ к текущему файлу. Любой запрос на открытие файла (этим или другим процессом) не будет выполнен, пока файл не будет закрыт.

File.Open(name, FileMode.Open, FileAccess.Read, FileShare.None);

РЕДАКТИРОВАТЬ: Не забудьте обернуть в блок Try / Catch, и использование FileShare.None фактически означает, что вы хотите открыть файл исключительно.

1 голос
/ 17 декабря 2008

Использовать System.IO.File.OpenWrite (путь). Окружите его блоком try / catch, и если он уже открыт для записи в другом месте, вы получите исключение System.UnauthorizedAccessException.

0 голосов
/ 17 декабря 2008

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

Вместо этого просто попробуйте открыть его и посмотреть, есть ли у вас ошибки.

0 голосов
/ 17 декабря 2008

Следующий синтаксис поможет:

FileStream s2 = новый FileStream (имя, FileMode.Open, FileAccess.Read, FileShare.Read);

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