Поведение блокировки отличается через сетевые ресурсы - PullRequest
5 голосов
/ 23 апреля 2010

Я пытался заблокировать файл, чтобы другие клонированные службы не могли получить к нему доступ. Затем я читаю файл, а затем переместите файл, когда закончите. Перемещение разрешено с помощью FileShare.Delete.

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

Почему приведенная ниже демонстрация работает с локальным файлом, но не с сетевым файлом?

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

string sourceFile = @"C:\TestFile.txt";
string localPath = @"C:\MyLocalFolder\TestFile.txt";
string networkPath = @"\\MyMachine\MyNetworkFolder\TestFile.txt";

File.WriteAllText(sourceFile, "Test data");

if (!File.Exists(localPath))
    File.Copy(sourceFile, localPath);

foreach (string path in new string[] { localPath, networkPath })
{
    using (FileStream fsLock = File.Open(path, FileMode.Open, FileAccess.ReadWrite, (FileShare.Read | FileShare.Delete)))
    {
        string target = path + ".out";
        File.Move(path, target); //This is the point of failure, when working with networkPath

        if (File.Exists(target))
            File.Delete(target);
    }

    if (!File.Exists(path))
        File.Copy(sourceFile, path);
}

РЕДАКТИРОВАТЬ: Стоит отметить, что, если вы хотите переместить файл с одного сетевого ресурса на другой сетевой ресурс, пока блокировка установлена, это работает. Эта проблема возникает только при перемещении файла в той же общей папке , когда он заблокирован.

1 Ответ

3 голосов
/ 20 июля 2011

Я считаю, что System.IO.File.Open () сопоставляется с функцией Win32 API CreateFile ().В документации Microsoft для этой функции [http://msdn.microsoft.com/en-us/library/aa363858(v=vs.85).aspx] упоминается следующее:

Windows Server 2003 и Windows XP / 2000: нарушение совместного доступа происходит, если предпринята попытка открытьфайл или каталог для удаления на удаленном компьютере, когда значением параметра dwDesiredAccess является флаг доступа DELETE (0x00010000) ИЛИ с любым другим флагом доступа, и удаленный файл или каталог не был открыт с помощью FILE_SHARE_DELETE.Чтобы избежать нарушения общего доступа в этом сценарии, откройте удаленный файл или каталог только с правом доступа DELETE или вызовите DeleteFile без предварительного открытия файла или каталога для удаления.

В соответствии с этим вы могли быдолжен передать DELETE в качестве параметра FileAccess IO.File.Open ().К сожалению, перечисление DELETE не было включено в качестве опции.

Эта проблема относится только к Windows 2003 и более ранним версиям.Я проверил ваш код на Windows 2008 R2 SP1, и он отлично работает.Так что вполне возможно, что это будет работать и на Windows 2008.

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