Прочитать файл из подпапки папки установки приложения

Мне нужно прочитать текстовое содержимое из файла .txt, этот файл находится в папке с установленным приложением, во вложенной папке, согласно документы Microsoft, я делаю это следующим образом:

 private async void readMyFile()
    {
        // Get the app's installation folder.
        StorageFolder appFolder = Windows.ApplicationModel.Package.Current.InstalledLocation;

        // Get a file from a subfolder of the current folder by providing a relative path.
        string txtFileName = @"\myfolder\myfile.txt";

        try
        {
            //here my file exists and I get file path
            StorageFile txtfile = await appFolder.GetFileAsync(txtFileName);
            Debug.WriteLine("ok file found: " + txtfile.Path);

            //here I get the error
            string text = await FileIO.ReadTextAsync(txtfile);
            Debug.WriteLine("Txt is: " + text);
        }
        catch (FileNotFoundException ex)
        {
        }

    }

ошибка:

    Exception thrown: 'System.IO.FileNotFoundException' in mscorlib.ni.dll
exception file not found: System.IO.FileNotFoundException: The filename, directory name, or volume label syntax is incorrect. (Exception from HRESULT: 0x8007007B)
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at Smadshop.MainPage.<testExistsFile>d__8.MoveNext()

Должен заметить, что если я использую файл без подпапки, все работает нормально.


person Vasile Doe    schedule 16.02.2016    source источник


Ответы (4)


вы можете сделать это по-другому, используя URI :

using Windows.Storage;
StorageFile file = await StorageFile.GetFileFromApplicationUriAsync("ms-appx:///file.txt");

Итак, в вашем случае это будет:

StorageFile txtfile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///myfolder/myfile.txt"));
person Choletski    schedule 16.02.2016

Я думаю, вам нужно использовать:

string txtFileName = @".\myfolder\myfile.txt";

Точка в имени файла обозначает текущую папку. Если вы хотите указать относительные пути, то @"\myfolder\myfile.txt" неверно.

person Maarten    schedule 16.02.2016
comment
Nitpick: @"\myfolder\myfile.txt" тоже относительный путь, только от корня устройства... Может работать в настольных приложениях .Net (не UWP, как в случае с OP) при просмотре из корня текущего диска. - person Alexei Levenkov; 16.02.2016
comment
хорошо, может быть, это неправильно, но я могу получить файл, используя StorageFile txtfile = await appFolder.GetFileAsync(txtFileName);, но ваше решение говорит мне An exception of type 'System.ArgumentException' occurred in mscorlib.ni.dll but was not handled in user code WinRT information: An item cannot be found with the specified name (.\myfolder\myfile.txt). Additional information: The parameter is incorrect - person Vasile Doe; 16.02.2016

GetFileAsync займет относительный путь в форме folder/fileName. Вы также можете сначала получить папку, а затем файл или использовать GetItemAsync

StorageFolder appFolder = Windows.ApplicationModel.Package.Current.InstalledLocation;
// Get a file from a subfolder of the current folder
// by providing a relative path.
string image = @"Assets\Logo.scale-100.png";
var logoImage = await appFolder.GetFileAsync(image);
person Alexei Levenkov    schedule 16.02.2016

@"\myfolder\myfile.txt"; если это сетевой путь должен быть @"\\myfolder\myfile.txt"; Если это локальный файл, ему нужна буква диска, т.е. @"c:\myfolder\myfile.txt";

Однако документация для GetFileAsync показывает, что файл в подпапке будет @"myfolder\myfile.txt"

Когда вы используете имя файла без подпапки, оно будет выглядеть в текущей папке.

person Fred    schedule 16.02.2016
comment
@VasileDoe Документация для GetFileAsync показывает, что файл в подпапке будет @"myfolder\myfile.txt" - person Fred; 16.02.2016
comment
да, вот и все - я изменю ваш ответ как правильный, если вы отредактируете его в соответствии с этим комментарием - person Vasile Doe; 16.02.2016