Estoy usando un FolderPicker en mi aplicación universal de Windows para que el usuario elija un directorio, y cuando lo hayan hecho, necesito acceder a varios archivos diferentes en subrutas conocidas debajo de ese directorio. Puedo elegir bien el directorio, pero cuando trato de acceder a cosas en subrutas desde allí, todavía se me niega el acceso. ¿Hay alguna forma de otorgar acceso a varios archivos en un directorio principal sin tener que obligar al usuario a seleccionar manualmente cada archivo al que se debe acceder?

Aquí está mi código que abre el selector de carpetas y agrega el directorio elegido a mi futura lista de acceso:

var folderPicker = new Windows.Storage.Pickers.FolderPicker();
folderPicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.Desktop;
folderPicker.FileTypeFilter.Add("*");

Windows.Storage.StorageFolder folder = await folderPicker.PickSingleFolderAsync();
if (folder != null) {
       StorageApplicationPermissions.FutureAccessList.AddOrReplace("GitDirectory", folder);
       PathTextBox.Text = folder.Path;
       this.IsPrimaryButtonEnabled = true;
}

(disculpas por mis convenciones de nomenclatura, soy nuevo en el mundo de Win / C #, así que estoy escribiendo de una manera mezcolanza que sé)

Aquí está el código de otra clase que intenta acceder a una ruta secundaria. Puede asumir que a la variable GitDirectory se le asignó previamente el resultado de llamar a FutureAccessList.GetFolderAsync("GitDirectory"); porque tiene:

StorageFile iniFile = await GitDirectory.GetFileAsync(@"datafiles\i18n\en_US.ini");
IniData data = iniParser.ReadFile(iniFile.Path);

Es esta última línea la que finalmente lanza esta excepción: Access to the path 'E:\Documents\git\asirra\datafiles\i18n\en_US.ini' is denied.

Gracias por cualquier ayuda de antemano

0
Nick 30 oct. 2019 a las 04:30

1 respuesta

La mejor respuesta

El problema aquí es que cuando tiene acceso a un archivo a través de una instancia StorageFile en una ubicación arbitraria (elegida por el usuario), necesita usar esta instancia específica para trabajar con el archivo. No puede acceder al archivo directamente accediendo a su ruta (file.Path).

Revisé el código fuente IniParser en GitHub y descubrí que puedes usar IniDataParser API en su lugar, por ejemplo, el siguiente método:

IniData Parse(StringReader stringReader)

Puede leer el archivo ini y luego pasarlo al analizador:

var iniFile = await GitDirectory.GetFileAsync(@"datafiles\i18n\en_US.ini");
var text = await FileIO.ReadAllTextAsync(iniFile);
var parser = new IniDataParser();
var data = parser.Parse(text);
4
Martin Zikmund 30 oct. 2019 a las 09:03