2010-10-02 16 views
7

Sto costruendo un'applicazione in C# in cui devo aprire un file CSV per leggere i dati da esso. Ricevo un'eccezione quando provo ad aprire il file CSV da C# quando quel file è già aperto in Excel. L'eccezione indica che il processo non può accedere al file poiché è già aperto. Come posso risolvere questo problema e aprire il file anche se è aperto in un'altra applicazione?Eccezione nell'apertura di un file che è già aperto

Grazie, Rakesh.

+0

si prega di inviare il codice per mostrarci ciò che avete fatto finora – Woot4Moo

+1

Questo è il codice: utilizzando (FileStream fs = new FileStream (csvOpenFileDialog.FileName, FileMode.Open, FileAccess.Read)) –

+0

Ti manca un argomento. Leggi la mia risposta. – Nayan

risposta

7

Ho affrontato questo problema qualche tempo fa.

Ti manca il parametro FileShare. Senza specificare che, se apri un file, verrà bloccato esclusivamente dalla tua applicazione. Ma poiché è già stato aperto da Excel (o da qualsiasi altra app), riceverai un'eccezione.

Puoi provare a utilizzare questo - credo che questo sarà la vostra migliore scommessa -

using (FileStream fs = File.Open(<file-path>, FileMode.Open, FileAccess.Read, FileShare.Read))

Questo codice dice: Ciao Excel! Se puoi consentire (leggi, non lanciare eccezioni), mi piacerebbe leggere il file, anche se non cercherò di possederlo e so che puoi modificarlo in qualsiasi momento.

Se questo genera un errore, allora Excel ti ha negato anche l'accesso in lettura. Peccato allora! Tutto il meglio.

+2

Ho trovato FileShare.Read non ha funzionato, mentre FileShare.ReadWrite ha fatto –

+1

Non so cosa hai fatto, ma .... è buono - qualunque cosa funzioni per te! – Nayan

+0

Utilizzare FileShare.ReadWrite anziché FileShare.Read, come indicato da Hans. –

0

A causa di problemi di concorrenza non si può avere la possibilità di scrivere a due istanze dello stesso file. Dovrebbe essere possibile aprirne uno in sola lettura, in questo modo non ci sarà un problema di concorrenza poiché la lettura è garantita come thread-safe. This article dovrebbe spiegare come fare quello che ho proposto

+0

Sto aprendo il file da C# in modalità di sola lettura. Ma ancora ottengo questa eccezione. Quale potrebbe essere il problema e come posso risolverlo? –

0

questo non è possibile.

Un file può essere aperto con diversi tipi di protezione. Excel apre il file esclusivamente, allo scopo di proteggere il file da eventuali modifiche da parte di altri programmi e quindi ripristinato quando Excel lo salva.

Excel avrebbe potuto aprire il file e consentire la lettura, ma poi si potrebbe finire in una situazione di deadlock in cui due applicazioni hanno il file aperto per la lettura e nessuno dei due può salvarlo.

+0

Questo non sembra essere il caso in base al link che ho fornito. – Woot4Moo

+0

@ Woot4Moo: questo articolo riguarda l'apertura di un foglio di calcolo, non un file CSV e l'apertura di un file per l'accesso in sola lettura, non l'apertura di un file già aperto in modo esclusivo, quindi mi dispiace ma non è affatto pertinente. – Guffa

+0

in realtà è abbastanza rilevante. Se OP esamina l'ordine con cui i file vengono aperti, è possibile che Excel apri il file come istanza di sola lettura che potrebbe attenuare il problema – Woot4Moo

7

È possibile ma è necessario controllare attentamente la condivisione dei file specificata. La maggior parte delle classi .NET si imposta automaticamente su FileShare.Read, impedendo a un altro processo di scrivere sul file. Ma questo non può funzionare se il file viene aperto da Excel, ha già ottenuto l'accesso in scrittura ad esso. Non puoi negare un diritto che è già stato acquisito.

per risolvere il problema, rendere il codice simile a questo:

 using (var fs = new FileStream(@"c:\\temp\\test.csv", FileMode.Open, 
        FileAccess.Read, FileShare.ReadWrite)) 
     using (var sr = new StreamReader(fs)) { 
      // Read it... 
     } 

Nota l'uso di FileShare.ReadWrite. Ho verificato che questo codice funzioni mentre Excel ha aperto test.csv.

Attenzione al potenziale problema si invitano con questo, cose strane possono accadere quando Excel scrive nel file proprio come si sta leggendo. Probabilmente leggerà spazzatura, parte di vecchi dati, parte di nuovi, senza un buon modo per diagnosticare questo.

0

Un'altra soluzione, suggerita da this answer, è quello di copiare il file in un file temporaneo e aprire quella.

Usa

System.IO.File.Copy(sourcepath, copypath, false); 
Problemi correlati