Comment puis-je ouvrir un fichier qui est ouvert dans une autre application
j'ai une application winforms qui charge des fichiers excel pour analyse. Actuellement, pour ouvrir le fichier excel, le fichier ne doit pas être déjà ouvert dans excel, sinon une FileIOException est lancée lorsque j'essaie de charger le fichier.
ce que je voudrais faire est de permettre à mon application de lire dans le fichier même si elle est ouverte dans excel plutôt que de forcer l'utilisateur à fermer la feuille de travail en premier. Notez que l'application en question a seulement besoin de lire le fichier, pas d'écrire il.
Est-ce possible?
4 réponses
Vous pouvez essayer de passer FileShare.ReadWrite lors de l'ouverture du fichier:
using (var stream = new FileStream(
@"d:\myfile.xls",
FileMode.Open,
FileAccess.Read,
FileShare.ReadWrite))
{
}
comment essayez-vous d'ouvrir le fichier?
Si vous essayez de l'ouvrir pour lire/écrire ensuite, 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
défini pour permettre à d'autres applications (c.-à-d. les vôtres) d'avoir accès au fichier. Si ce n'est pas défini, Excel aura ouvert le fichier avec accès exclusif. Note: je ne pense pas que ce soit le cas comme vous pouvez l'ouvrir un fichier Excel (Excel) pour lire si quelqu'un d'autre l'a ouvert pour le modifier.
UPDATE - OK je ne l'ai testé correctement qu'après les commentaires de darin. Vous avez besoin de l' FileShare.ReadWrite
drapeau malgré l'aide indiquant que c'est pour les ouvreurs de fichiers suivants. Même pas FileShare.Read
est assez bonne, qui, je trouve même étrangeté.
Tableatgear for .NET peut lire les cahiers tandis que Excel les a ouverts. Voici le code que nous utilisons pour le faire (notez que nous verrouillons tout le fichier après l'ouverture pour empêcher Excel ou toute autre application d'écrire pendant que nous sommes en train de lire):
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;
}
avertissement: je possède SpreadsheetGear LLC
essayez de faire une copie du fichier déjà ouvert, lisez-le et jetez-le. Afin de vérifier si le fichier est déjà ouvert, essayez de lire et gérer l'exception en faisant la copie, lire, jeter.