Vă mulțumim pentru susținere

Cum se verifică blocarea fișierelor?

Există vreo modalitate de a verifica dacă un fișier este blocat fără a utiliza un bloc de încercare / captură?

Chiar acum, singura modalitate prin care cunosc este de a deschide fișierul și de a captura orice System.IO.IOException .

0
adăugat editat
Aceasta este o întrebare veche, iar toate vechile răspunsuri sunt incomplete sau greșite. Am adăugat un răspuns complet și corect.
adăugat autor Eric J.
Știu că nu este chiar răspunsul la întrebare așa cum este, dar un anumit subset de dezvoltatori care se uită la asta pentru ajutor ar putea avea această opțiune: Dacă începeți procesul care deține blocarea cu System.Diagnostics.Process puteți .WaitForExit ().
adăugat autor amalgamate
Problema este că o IOExcepție ar putea fi aruncată din mai multe motive, altele decât un fișier blocat.
adăugat autor JohnFx

5 răspunsuri

Nu, din păcate, și dacă vă gândiți la ele, acele informații ar fi oricum lipsite de valoare, deoarece dosarul ar putea fi blocat în următoarea secundă (citiți: scurtă perioadă de timp).

De ce trebuie să știți în mod special dacă fișierul este blocat oricum? Știind că ne-ar putea da altă modalitate de a vă oferi sfaturi bune.

Dacă codul dvs. ar arăta astfel:

if not locked then
    open and update file

Apoi, între cele două linii, un alt proces ar putea bloca cu ușurință fișierul, oferindu-vă aceeași problemă pe care încercați să o evitați să începeți cu: excepții.

0
adăugat
Da, dar verificarea independentă dacă un fișier este blocat este inutil, singura modalitate corectă de a face acest lucru este să încercați să deschideți fișierul pentru scopul în care aveți nevoie de fișier și apoi să rezolvați problema blocării la acel punct. Și apoi, după cum spuneți, așteptați sau faceți altfel.
adăugat autor Lasse Vågsæther Karl
@Bart Vă rugăm să elaborați, unde este definită această metodă, puteți furniza o legătură cu aceasta? Și vă rugăm să rețineți că răspunsul meu a fost postat în al treilea trimestru al anului 2008, runtime diferite .NET și toate, dar încă .... Ce este File.ReadWaitForUnlock ?
adăugat autor Lasse Vågsæther Karl
Acum este posibil să obțineți procesul care blochează un fișier. Consultați stackoverflow.com/a/20623302/141172
adăugat autor Eric J.
Cred că cel mai bine este să faci o metodă File.ReadWaitForUnlock (file, timeout). și returnează null sau FileStream în funcție de succes. Urmăm logica aici?
adăugat autor Bart Calixto
@ LasseV.Karlsen checkout răspunsul meu pentru ceea ce am ajuns folosind pe baza răspunsului dumneavoastră. ReadWaitForUnlock este metoda mea proprie, schimbată la TryOpenRead la final.
adăugat autor Bart Calixto
Puteți susține același lucru și în ceea ce privește drepturile de acces, deși ar fi, desigur, mai puțin probabil.
adăugat autor ctusch
Dacă fișierul este blocat, putem să așteptăm ceva timp și să încercăm din nou. Dacă este un alt tip de problemă cu acces la fișiere, atunci ar trebui să propagăm doar excepția.
adăugat autor DixonD
@ LasseV.Karlsen Un alt avantaj de a face o verificare preventivă este că puteți notifica utilizatorul înainte de a încerca o posibilă operațiune de lungă durată și întreruperea la jumătatea drumului. Blocarea care are loc la jumătatea drumului este totuși posibilă, desigur, și trebuie rezolvată, însă în multe scenarii acest lucru ar ajuta considerabil experiența utilizatorului.
adăugat autor Thiru

Ai putea apela LockFile prin interop în regiune din fișierul care vă interesează. Aceasta nu va arunca o excepție, dacă reușește, veți avea o blocare pe acea porțiune a fișierului (care este păstrată de procesul dvs.), această blocare va fi reținută până când apelați UnlockFile sau procesul dvs. moare.

0
adăugat

Puteți vedea dacă fișierul este blocat încercând să îl citiți mai întâi.

Please see my answer here for more information.

0
adăugat

Atunci între cele două linii, un alt proces ar putea bloca cu ușurință fișierul, oferindu-vă aceeași problemă pe care încercați să o evitați pentru a începe cu: excepții.

Cu toate acestea, în acest fel, știți că problema este temporară și încercați din nou mai târziu. (De exemplu, ați putea scrie un fir care, dacă întâlnește o blocare în timp ce încearcă să scrie, continuă să reînnoiească până când blocarea a dispărut.)

IOExcepția, pe de altă parte, nu este însă suficient de specifică dacă blocarea este cauza eșecului IO. Ar putea exista motive care nu sunt temporare.

0
adăugat

În loc să utilizați interop, puteți utiliza metodele din clasa .NET FileStream Blocare și deblocare:

FileStream.Lock http://msdn.microsoft.com/en-us/library/system.io.filestream.lock.aspx

FileStream.Unlock http://msdn.microsoft.com/en-us/library/system.io.filestream.unlock.aspx

0
adăugat
Acesta este cu adevărat răspunsul corect, deoarece oferă utilizatorului posibilitatea de a nu numai să blocheze / deblocheze fișiere, ci și secțiuni ale fișierelor. Toate comentariile "Nu poți să faci asta fără tranzacții" pot ridica o preocupare valabilă, dar nu sunt utile deoarece pretinde că funcționalitatea nu este acolo sau cumva este ascunsă când nu este.
adăugat autor BrainSlugs83
De fapt, aceasta nu este o soluție deoarece nu puteți crea o instanță a FileStream dacă fișierul este blocat. (o excepție va fi aruncată)
adăugat autor Zé Carlos