Я, кажется, ударил кирпичную стену, пытаясь разработать приложение для Windows Store для рабочего стола. Я пытаюсь открыть большой файл журнала (100+ МБ), открытое другим приложением, и выполнять обработку в реальном времени на последних событиях, когда они записываются в файл.UWP - Не удается открыть файл для чтения, если другое приложение открыто.
При регулярном, неизолированные C#, это довольно просто:
System.IO.FileStream stream = File.Open("LOGFILE PATH HERE", System.IO.FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
К сожалению, в UWP, я получаю «UnauthorizedAccessException» всякий раз, когда я пытаюсь открыть файл, который находится в использовании другого приложения. Я пробовал каждый API в каждой комбинации, которую я мог найти, но имел нулевую удачу, поэтому я пришел сюда для некоторых предложений.
Некоторые из того, что я пробовал:
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();
Быстрый Репро:
Открыть окно PowerShell и запустите эту команду, чтобы держать открытым "test.txt" в вашем домашнем каталоге:
$f = [System.IO.File]::Open("test.txt", [System.IO.FileMode]::OpenOrCreate, [System.IO.FileAccess]::Write, [System.IO.FileShare]::ReadWrite);
Посмотреть это сообщение: http://stackoverflow.com/questions/4400517/how-can-i-read-a-file-even-when-getting-an-in-use-by-another-process -exception – Sparrow
Это только для приложений, отличных от UWP, в этом случае это не сработает. Это первое, что я попробовал. Также у меня есть этот код в качестве примера того, что не работает в моем комментарии: * ( –
Человек, это расстраивает .. согласно System.Diagnostics.Stopwatch, ReadBufferAsync занимает 100 мс, чтобы читать скромный файл журнала 100 МБ даже на моем SSD-оборудованная сверхбыстрая машина для разработчиков, поэтому я думаю, что это действительно буферизует весь файл. Между тем, в файлах, которые еще не открыты, метод OpenAsync (...) StorageFile занимает менее 2 мс, так что это именно то, что мне нужно Fiddlesticks !!! –