Domanda

Sto cercando di utilizzare uno StreamReader per leggere un file, ma è sempre utilizzato da un altro processo, quindi ottengo questo errore:

  

Il processo non può accedere al file   '\ Arfjwknasgmed17 \ C $ \ FLAG   CONDITION \ CP-ARFJN-FLAG.XLS 'perché   viene utilizzato da un altro processo.

C'è un modo in cui posso leggere questo senza copiarlo? O questa è la mia unica opzione?

È stato utile?

Soluzione

Puoi leggere il file solo se il programma che ha aperto il file ha specificato per la prima volta i diritti di condivisione della lettura su quel file.

Se il file non ha effettivamente diritti di condivisione in lettura, non saresti in grado di copiarlo in primo luogo.

Potrebbe non essere possibile accedere a un file se si specifica un diritto di condivisione in conflitto con il diritto di condivisione di un programma che ha già aperto il file. Ad esempio, non puoi concedere l'accesso in scrittura se il programma che ha già aperto non sta concedendo l'accesso in scrittura.

Se il programma che ha aperto il file in primo luogo supporta Volume Shadow Copy (VSS), è anche possibile utilizzare VSS per ottenere l'accesso al file.

Esistono driver software commerciali che ti consentono di accedere a tali file, anche quando sono in uso. Un tempo riuscivi a ottenere Open File Manager da St-Bernards e puoi anche utilizzare File Access Manager (FAM) di VisionWorks Solutions Inc. Questi driver sono in genere OEM destinati alle società di software di backup per l'inclusione nei loro prodotti.

VSS funziona dicendo al programma che ha già aperto il file che un altro programma vorrebbe leggere dal file. VSS quindi esegue una copia del file e consente di leggere da questa copia. VSS non funziona per applicazioni legacy.

FAM funziona in modo trasparente per i programmi legacy e non legacy specificando un 'elenco consentito' di applicazioni che possono accedere esclusivamente ai file aperti e bloccati. Solo i programmi in questo elenco possono accedere a questi file. Quando un file viene aperto, passa in modalità cache in modo da ottenere una copia del file com'era all'avvio del "backup / apertura" del file. A questo punto il programma che ha originariamente aperto il file vede il file così com'è in realtà, e il secondo programma nell'elenco consentito, vede il file com'era quando è avvenuta la 'apertura / backup' del file. Ciò garantisce la coerenza del file.

Altri suggerimenti

prova il codice qui sotto.

FileStream fileStr = File.Open(<full file name>, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
fileStream = new StreamReader(fileStr);

L'ho provato su Windows XP. Se il file è già aperto in modalità di scrittura da qualche altro processo & amp; non ha specificato i diritti di condivisione, sarai comunque in grado di aprire il file in modalità lettura.

Dichiarazione di non responsabilità: funziona, ma poi non sono sicuro che dovresti usarlo nel codice di produzione. Non sono ancora riuscito a trovare alcuna documentazione formale che affermi che dovrebbe funzionare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top