2009-06-26 17 views
20

J'ai une application winforms qui charge dans des fichiers Excel pour l'analyse. Actuellement, afin d'ouvrir le fichier Excel, le fichier ne doit pas être déjà ouvert dans Excel sinon une exception FileIOException est levée lorsque j'essaie de charger dans le fichier.Comment ouvrir un fichier qui est ouvert dans une autre application

Ce que je voudrais faire est de permettre à ma demande de lire dans le fichier même si elle est ouverte dans Excel plutôt que de forcer l'utilisateur à fermer la feuille de calcul en premier. Notez que l'application en question a seulement besoin de lire le fichier et non d'y écrire.

Est-ce possible?

Répondre

26

Vous pouvez essayer passer FileShare.ReadWrite lors de l'ouverture du fichier:

using (var stream = new FileStream(
     @"d:\myfile.xls", 
     FileMode.Open, 
     FileAccess.Read, 
     FileShare.ReadWrite)) 
{ 

} 
+0

Je pense que le drapeau FileShare est pour l'autre cas - lorsque vous voulez permettre aux autres applications d'avoir accès au fichier – ChrisF

+0

Ceci à partir des métadonnées: "Contient des constantes pour contrôler le type d'accès d'autres objets System.IO.FileStream peuvent avoir le même fichier " – ChrisF

+4

Dans le cas de futurs ouvreurs, un FileShare.Read signifie" les futurs ouvreurs peuvent ouvrir le fichier pour la lecture ". Dans le cas d'ouvreurs passés, FileShare.Read signifie "ouvrir ce fichier pour moi seulement s'il a des ouvreurs passés qui l'ont ouvert en lecture seule". C'est pourquoi FileShare.ReadWrite doit être utilisé ici, car Excel ouvre le fichier en écriture. –

6

Comment essayez-vous d'ouvrir le fichier?

Si vous essayez de l'ouvrir en lecture/écriture, vous aurez l'exception. Si vous essayez de l'ouvrir en lecture seule, alors vous devriez être OK.

var file = File.Open("file.xls", FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 

Cela ne fonctionnera que si Excel a ouvert le fichier avec FileShare.Read ensemble pour permettre à d'autres applications (à savoir) la vôtre d'avoir accès au dossier. Si ce n'est pas le cas, Excel ouvrira le fichier avec un accès exclusif. Note: Je ne pense pas que ce soit le cas car vous pouvez ouvrir un fichier Excel (dans Excel) pour le lire si quelqu'un d'autre l'a ouvert pour le modifier.

MISE À JOUR - OK Je n'ai pas testé correctement ceci qu'après les commentaires de darin. Vous avez besoin du drapeau FileShare.ReadWrite malgré l'aide indiquant que c'est pour les ouvertures de fichiers suivantes. Pas même FileShare.Read est assez bon, que je trouve encore plus étrange.

+0

Ce n'est pas correct. Utiliser FileShare.Read signifie: "ouvrir ce fichier pour moi seulement si des ouvreurs précédents l'ont ouvert pour Read." ce qui n'est pas le cas car Excel l'a ouvert pour l'écriture. –

+2

@darin - Je n'utilise pas FileShare. – ChrisF

+0

Bonne réponse. En effet, les fichiers Excel ne sont pas ouverts avec un accès exclusif, donc cette méthode est tout à fait possible. – Noldorin

0

Essayez de faire une copie du fichier déjà ouvert, lu et le jeter. Afin de vérifier si le fichier est déjà ouvert, essayez de lire et gérer l'exception en faisant la copie, lire, rejeter.

1

peut lire des classeurs pendant qu'Excel les a ouverts. Voici le code que nous utilisons pour le faire (notez que nous fermons le dossier complet après l'ouverture pour maintenir Excel ou toute autre application d'écrire alors que nous sommes au milieu de la lecture):

stream = new System.IO.FileStream(path, 
    System.IO.FileMode.Open, 
    System.IO.FileAccess.Read, 
    System.IO.FileShare.ReadWrite, 
    SG.CompoundDocumentIO.Storage.OpenBufferLength); 
try 
{ 
    stream.Lock(0, stream.Length); 
} 
catch 
{ 
    // .NET 1.1 requires cast to IDisposable 
    ((IDisposable)stream).Dispose(); 
    throw; 
} 

Disclaimer: Je possède SpreadsheetGear LLC

Questions connexes