Il semble que j'aie atteint un mur de briques en essayant de développer une application Windows Store pour le bureau. J'essaye d'ouvrir un grand fichier journal (100+ Mo) qu'une autre application a ouvert et de faire un traitement en temps réel sur les derniers événements tels qu'ils sont écrits dans le fichier.UWP - Impossible d'ouvrir le fichier à lire si une autre application l'a ouvert.
Avec régulière, non sandbox C#, cela est assez simple:
System.IO.FileStream stream = File.Open("LOGFILE PATH HERE", System.IO.FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
Malheureusement, dans un UWP, je reçois « UnauthorizedAccessException » chaque fois que je tente d'ouvrir un fichier qui est utilisé par une autre application. J'ai essayé toutes les API dans toutes les combinaisons que j'ai pu trouver, mais je n'ai pas eu de chance, alors je suis venu ici pour quelques suggestions.
Certains de ce que j'ai essayé:
Windows.Storage.Pickers.FileOpenPicker picker = new Windows.Storage.Pickers.FileOpenPicker();
picker.ViewMode = Windows.Storage.Pickers.PickerViewMode.List;
//Prompt the user to open the log file:
Windows.Storage.StorageFile logFile = await picker.PickSingleFileAsync();
picker.FileTypeFilter.Add(".txt");
//This won't work in any case, because it doesn't use the handle that the user picked,
// so the UWP sandboxing blocks it:
new FileStream(logFile.Path, FileMode.OpenOrCreate, FileAccess.Read);
//EDIT: These don't work if the file is open either, I must have made a mistake earlier
await FileIO.ReadBufferAsync(logFile);
await FileIO.ReadLinesAsync(logFile);
//These work if the file is not open by another app, but fail if another app has the file open
await logFile.OpenAsync(Windows.Storage.FileAccessMode.Read);
await logFile.OpenStreamForReadAsync();
rapide Repro:
Ouvrez une fenêtre PowerShell et exécutez cette commande pour maintenir ouverte "test.txt" dans votre répertoire personnel:
$f = [System.IO.File]::Open("test.txt", [System.IO.FileMode]::OpenOrCreate, [System.IO.FileAccess]::Write, [System.IO.FileShare]::ReadWrite);
Voir ce post: http://stackoverflow.com/questions/4400517/how-can-i-read-a-file-even-when-getting-an-in-use-by-another-process -exception – Sparrow
C'est seulement pour les applications non-UWP, cela ne fonctionnera pas dans ce cas .. c'est la première chose que j'ai essayé. Aussi, j'ai ce code comme exemple de ce qui n'a pas fonctionné dans mon commentaire: * ( –
Man, c'est frustrant .. selon le System.Diagnostics.Stopwatch, ReadBufferAsync prend 100ms pour lire un fichier journal modeste 100MB même sur mon En outre, je suppose que c'est vraiment la mémoire tampon du fichier entier Pendant ce temps, sur les fichiers qui ne sont pas déjà ouverts, la méthode OpenSync (...) de StorageFile prend moins de 2 ms, donc c'est exactement ce dont j'ai besoin –