2010-04-23 14 views
5

Próbowałem zablokować plik, aby inne sklonowane usługi nie mogły uzyskać dostępu do pliku. Następnie odczytuję plik, a następnie przenoszę plik po zakończeniu. Ruch jest dozwolony przy użyciu FileShare.Delete.Zachowanie blokowania różni się za pomocą udziałów sieciowych

Jednak w późniejszych testach okazało się, że to podejście nie działa, jeśli patrzymy na udział sieciowy. Rozumiem, że moje podejście mogło nie być najlepsze, ale moje konkretne pytanie brzmi:

Dlaczego poniższe demo działa na plik lokalny, ale nie na plik sieciowy?

Im dokładniej możesz być tym lepszy, ponieważ w moich poszukiwaniach znalazłem bardzo mało informacji wskazujących, że udziały sieciowe zachowują się inaczej niż dyski lokalne.

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); 
} 

EDIT: Warto wspomnieć, że jeśli chcesz przenieść plik z jednego udziału sieciowego, aby innym udziale sieciowym, kiedy blokada jest na miejscu, to działa. Problem pojawia się tylko podczas przenoszenia pliku w ramach tego samego udziału pliku, gdy jest on zablokowany.

+0

Sprawdź, czy masz uprawnienia do zapisu w folderze udostępnionym. – Nayan

+0

Uprawnienia zostały sprawdzone i są w porządku. Aktywny użytkownik ma pełną kontrolę nad katalogiem i współdzieleniem – MattH

+0

Jaki rodzaj systemu operacyjnego zapewnia udział? –

Odpowiedz

3

Wierzę, że System.IO.File.Open() mapuje do funkcji Win32 API CreateFile(). W dokumentacji Microsoftu dla tej funkcji [http://msdn.microsoft.com/en-us/library/aa363858(v=vs.85).aspx] wymienia następujące:

Windows Server 2003 i Windows XP/2000: Naruszenie dzielenie występuje wtedy, gdy wykonywana jest próba otwarcia pliku lub katalogu do skasowania na pilocie komputer, gdy wartość parametru dwDesiredAccess jest flagą dostępu DELETE (0x00010000) OR'ed z dowolną inną flagą dostępu, a zdalny plik lub katalog nie został otwarty przy pomocy FILE_SHARE_DELETE. Aby uniknąć naruszenia zasad współużytkowania w tym scenariuszu, otwórz zdalny plik lub katalog z samym prawem dostępu DELETE lub wywołaj DeleteFile bez uprzedniego otwarcia pliku lub katalogu do usunięcia.

Zgodnie z tym, musiałbyś przekazać DELETE jako parametr FileAccess do IO.File.Open(). Niestety, wyliczenie DELETE nie zostało włączone jako opcja.

Ten problem dotyczy tylko systemu Windows 2003 i jego wcześniejszych wersji. Przetestowałem Twój kod w systemie Windows 2008 R2 SP1 i działa dobrze. Możliwe więc, że działa również na Windowsie 2008.

+0

Dzięki Brian. To wydaje się być poprawnym podsumowaniem i wyjaśnia, co widziałem. – MattH

Powiązane problemy