Permisos de acceso de archivos

Las aplicaciones de la Plataforma universal de Windows (UWP) pueden obtener acceso a determinadas ubicaciones del sistema de archivos de manera predeterminada. Asimismo, las aplicaciones también pueden tener acceso a otras ubicaciones mediante el selector de archivos o declarando funcionalidades.

Ubicaciones a las que pueden obtener acceso las aplicaciones para UWP

Al crear una aplicación nueva, puedes obtener acceso a las siguientes ubicaciones del sistema de archivos de manera predeterminada:

Directorio de instalación de la aplicación

Carpeta donde está instalada la aplicación en el sistema del usuario.

Principalmente, existen dos formas de acceder a los archivos y carpetas del directorio de instalación de la aplicación:

  1. Puedes recuperar una clase StorageFolder que represente el directorio de instalación de la aplicación como, por ejemplo:

    Windows.Storage.StorageFolder installedLocation = Windows.ApplicationModel.Package.Current.InstalledLocation;
    
    var installDirectory = Windows.ApplicationModel.Package.current.installedLocation;
    
    #include <winrt/Windows.Storage.h>
    ...
    Windows::Storage::StorageFolder installedLocation{ Windows::ApplicationModel::Package::Current().InstalledLocation() };
    
    Windows::Storage::StorageFolder^ installedLocation = Windows::ApplicationModel::Package::Current->InstalledLocation;
    

    Entonces podrás tener acceso a los archivos y carpetas del directorio mediante los métodos de la clase StorageFolder. En el ejemplo, StorageFolder se almacena en la variable installDirectory. Puede obtener más información sobre cómo trabajar con su paquete de la aplicación e instalar el directorio en la muestra de información de paquete de la aplicación en GitHub.

  2. Puedes recuperar un archivo directamente del directorio de instalación de la aplicación mediante un URI de aplicación como:

    using Windows.Storage;            
    StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///file.txt"));
    
    Windows.Storage.StorageFile.getFileFromApplicationUriAsync("ms-appx:///file.txt").done(
        function(file) {
            // Process file
        }
    );
    
    Windows::Foundation::IAsyncAction ExampleCoroutineAsync()
    {
        Windows::Storage::StorageFile file{
            co_await Windows::Storage::StorageFile::GetFileFromApplicationUriAsync(Windows::Foundation::Uri{L"ms-appx:///file.txt"})
        };
        // Process file
    }
    
    auto getFileTask = create_task(StorageFile::GetFileFromApplicationUriAsync(ref new Uri("ms-appx:///file.txt")));
    getFileTask.then([](StorageFile^ file) 
    {
        // Process file
    });
    

    Cuando finalice el método GetFileFromApplicationUriAsync, devolverá una clase StorageFile que representa al archivo file.txt en el directorio de instalación de la aplicación (file, en el ejemplo).

    El prefijo "ms-appx:///" del URI hace referencia al directorio de instalación de la aplicación. Puedes aprender más sobre cómo usar el URI de aplicación en How to use URIs to reference content (Cómo usar los URI para hacer referencia al contenido).

Además, a diferencia de lo que sucede con otras ubicaciones, también puedes tener acceso a los archivos del directorio de instalación de la aplicación si usas las API Win32 y COM para las aplicaciones de la Plataforma universal de Windows (UWP) y algunas de las funciones de la biblioteca estándar de C/C++ de Microsoft Visual Studio.

El directorio de instalación de la aplicación es una ubicación de solo lectura. No puede obtener acceso al directorio de instalación a través del selector de archivos.

Acceso a las ubicaciones de los datos de la aplicación

Son las carpetas en las que la aplicación puede almacenar datos. Estas carpetas (locales, móviles o temporales) se crean al instalar la aplicación.

Principalmente, existen dos formas de acceder a los archivos y carpetas de las ubicaciones de datos de su aplicación:

  1. Usa las propiedades de ApplicationData para recuperar una carpeta de datos de la aplicación.

    Por ejemplo, puedes usar ApplicationData.LocalFolder para recuperar una clase StorageFolder que represente la carpeta local de la aplicación de esta manera:

    using Windows.Storage;
    StorageFolder localFolder = ApplicationData.Current.LocalFolder;
    
    var localFolder = Windows.Storage.ApplicationData.current.localFolder;
    
    Windows::Storage::StorageFolder storageFolder{
        Windows::Storage::ApplicationData::Current().LocalFolder()
    };
    
    using namespace Windows::Storage;
    StorageFolder^ storageFolder = ApplicationData::Current->LocalFolder;
    

    Si quieres obtener acceso a la carpeta móvil o temporal de la aplicación, usa la propiedad RoamingFolder o, en su lugar, TemporaryFolder.

    Tras recuperar una clase StorageFolder que represente una ubicación de datos de la aplicación, podrás obtener acceso a los archivos y carpetas del directorio mediante los métodos de StorageFolder. En el ejemplo, estos objetos StorageFolder se almacenan en la variable localFolder. Puede obtener más información sobre el uso de las ubicaciones de los datos de la aplicación en las instrucciones de la página ApplicationData class (Clase ApplicationData) y descargando la muestra de datos de la aplicación de GitHub.

  2. Puede recuperar un archivo directamente desde la carpeta local de su aplicación usando un URI de la aplicación, como este:

    using Windows.Storage;
    StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appdata:///local/file.txt"));
    
    Windows.Storage.StorageFile.getFileFromApplicationUriAsync("ms-appdata:///local/file.txt").done(
        function(file) {
            // Process file
        }
    );
    
    Windows::Storage::StorageFile file{
        co_await Windows::Storage::StorageFile::GetFileFromApplicationUriAsync(Windows::Foundation::Uri{ L"ms-appdata:///local/file.txt" })
    };
    // Process file
    
    using Windows::Storage;
    auto getFileTask = create_task(StorageFile::GetFileFromApplicationUriAsync(ref new Uri("ms-appdata:///local/file.txt")));
    getFileTask.then([](StorageFile^ file) 
    {
        // Process file
    });
    

    Cuando finaliza el método GetFileFromApplicationUriAsync, devuelve un StorageFile que representa al archivo file.txt en la carpeta local de la aplicación (file, en el ejemplo).

    El prefijo "ms-appdata:///local/" del URI hace referencia a la carpeta local de la aplicación. Para obtener acceso a los archivos de las carpetas móvil o temporal de la aplicación, usa "ms-appdata:///roaming/" o "ms-appdata:///temporary/" en su lugar. Puedes obtener más información sobre cómo usar las URI de aplicación en el tema Cómo cargar recursos de archivos.

Asimismo, a diferencia de lo que sucede con otras ubicaciones, también puedes tener acceso a los archivos de las ubicaciones de datos de tu aplicación si usas las API Win32 y COM para aplicaciones para UWP y algunas de las funciones de la biblioteca estándar de C/C++ de Visual Studio.

No puede obtener acceso a las carpetas locales, itinerantes o temporales a través del selector de archivos.

Acceso a dispositivos extraíbles

Igualmente, la aplicación puede obtener acceso a algunos de los archivos en los dispositivos conectados de manera predeterminada. Esto es una alternativa en caso de que la aplicación use la extensión de reproducción automática para iniciarse automáticamente cuando los usuarios conecten al sistema un dispositivo, como una cámara o una unidad USB. Los archivos a los que la aplicación puede acceder se limitan a los tipos de archivo específicos que se definan a través de declaraciones de asociación de tipo de archivo en el manifiesto de la aplicación.

Sobra decir que también puedes tener acceso a los archivos y carpetas de un dispositivo extraíble llamando al selector de archivos (mediante FileOpenPicker y FolderPicker), y permitiendo que el usuario escoja los archivos y carpetas a los que la aplicación puede tener acceso. En Abrir archivos y carpetas con un selector encontrarás más información sobre el uso del selector de archivos.

Nota

Para obtener más información sobre cómo acceder a una tarjeta SD u otros dispositivos extraíbles, consulte Acceder a la tarjeta SD .

Carpeta de descargas del usuario

Es la carpeta donde se guardan de forma predeterminada los archivos que se descargan.

De manera predeterminada, tu aplicación puede acceder únicamente a los archivos y carpetas en la carpeta Descargas del usuario que la aplicación haya creado. No obstante, también puedes obtener acceso a ellos llamando a un selector de archivos (FileOpenPicker o FolderPicker), lo que permite que los usuarios puedan tener acceso a los archivos o carpetas y seleccionarlos para que la aplicación los use.

  • Puedes crear un archivo en la carpeta Descargas del usuario del siguiente modo:

    using Windows.Storage;
    StorageFile newFile = await DownloadsFolder.CreateFileAsync("file.txt");
    
    Windows.Storage.DownloadsFolder.createFileAsync("file.txt").done(
        function(newFile) {
            // Process file
        }
    );
    
    Windows::Storage::StorageFile newFile{
        co_await Windows::Storage::DownloadsFolder::CreateFileAsync(L"file.txt")
    };
    // Process file
    
    using Windows::Storage;
    auto createFileTask = create_task(DownloadsFolder::CreateFileAsync(L"file.txt"));
    createFileTask.then([](StorageFile^ newFile)
    {
        // Process file
    });
    

    DownloadsFolder.CreateFileAsync se sobrecarga para que pueda especificar qué debe hacer el sistema en caso de que ya haya un archivo con el mismo nombre en la carpeta Descargas. Cuando estos métodos se completen, devuelven una clase StorageFile que representa el archivo que se ha creado. Este archivo se llama newFile en el ejemplo.

  • Puedes crear una subcarpeta en la carpeta Descargas del usuario del siguiente modo:

    using Windows.Storage;
    StorageFolder newFolder = await DownloadsFolder.CreateFolderAsync("New Folder");
    
    Windows.Storage.DownloadsFolder.createFolderAsync("New Folder").done(
        function(newFolder) {
            // Process folder
        }
    );
    
    Windows::Storage::StorageFolder newFolder{
        co_await Windows::Storage::DownloadsFolder::CreateFolderAsync(L"New Folder")
    };
    // Process folder
    
    using Windows::Storage;
    auto createFolderTask = create_task(DownloadsFolder::CreateFolderAsync(L"New Folder"));
    createFolderTask.then([](StorageFolder^ newFolder)
    {
        // Process folder
    });
    

    DownloadsFolder.CreateFolderAsync se sobrecarga para que puedas especificar qué debe hacer el sistema en caso de que ya haya una subcarpeta con el mismo nombre en la carpeta Descargas. Cuando estos métodos se completen, devuelven una clase StorageFolder que representa la subcarpeta que se ha creado. Este archivo se llama newFolder en el ejemplo.

Acceder a más ubicaciones

Además de las ubicaciones predeterminadas, las aplicaciones pueden obtener acceso a archivos y carpetas adicionales mediante la declaración de funcionalidades en el manifiesto de la aplicación o bien mediante una llamada a un selector de archivos a fin de permitir que el usuario elija los archivos y carpetas a los que puede tener acceso la aplicación.

Las aplicaciones que declaran la extensión AppExecutionAlias tienen permisos del sistema de archivos a partir del directorio desde el que se inician en la ventana de la consola y hacia abajo.

Conservación del acceso a archivos y carpetas

Cuando una aplicación recupera un archivo o una carpeta mediante un selector, una activación de archivo, una operación de arrastrar y colocar, etc., solo tiene acceso a ese archivo o carpeta hasta que finalice la aplicación. Si quiere acceder automáticamente al archivo o carpeta en el futuro, puede agregarlo a FutureAccessList para que la aplicación pueda acceder fácilmente a ese elemento en el futuro. También puede usar MostRecentlyUsedList para administrar fácilmente una lista de archivos usados recientemente.

Funcionalidades para acceder a otras ubicaciones

En la siguiente tabla se incluyen otras ubicaciones a las que puedes tener acceso si declaras una funcionalidad o varias y usas la API de Windows.Storage correspondiente.

Location Capacidad API de Windows.Storage
Todos los archivos a los que tiene acceso el usuario. Por ejemplo: documentos, imágenes, fotos, descargas, escritorio, OneDrive, etc. broadFileSystemAccess

Esta es una funcionalidad restringida. El acceso se puede configurar en Configuración>Privacidad>Sistema de archivos . Debido a que los usuarios pueden conceder o denegar el permiso en cualquier momento en Configuración, debe asegurarse de que su aplicación sea resistente a esos cambios. Si encuentra que su aplicación no tiene acceso, puede elegir avisar al usuario que cambie la configuración proporcionando un vínculo al acceso del sistema de archivos de Windows 10 y al artículo de privacidad . Tenga en cuenta que el usuario debe cerrar la aplicación, alternar la configuración y reiniciar la aplicación. Si alterna la configuración mientras se ejecuta su aplicación, la plataforma suspenderá su aplicación para que pueda guardar el estado y luego forzar la finalización con el fin de aplicar la nueva configuración de la aplicación. En la actualización de abril de 2018, el valor predeterminado para el permiso es Activado. En la actualización de octubre de 2018, el valor predeterminado es Desactivado.

Si envía una aplicación a la Store que declara esta capacidad, deberá proporcionar descripciones adicionales de por qué su aplicación necesita esta funcionalidad y cómo pretende usarla.

Esta funcionalidad funciona para las API del espacio de nombres Windows.Storage. Consulte la sección Ejemplo al final de este artículo para ver un ejemplo de cómo habilitar esta funcionalidad en su aplicación.

Nota: Esta funcionalidad no es compatible con Xbox.
N/D
Documentos documentsLibrary

Nota: debes incluir en el manifiesto de la aplicación aquellas asociaciones de tipo de archivo que declaren los tipos de archivo concretos a los que la aplicación tiene acceso en esta ubicación.

Usa esta funcionalidad si tu aplicación:
- Facilita el acceso sin conexión entre plataformas al contenido específico de OneDrive mediante direcciones URL o id. de recursos de OneDrive válidos.
- Guarda los archivos abiertos en la cuenta OneDrive del usuario automáticamente y sin conexión
KnownFolders.DocumentsLibrary
Música musicLibrary
Consulta también Archivos y carpetas de las bibliotecas de música, imágenes y vídeos.
KnownFolders.MusicLibrary
Imágenes picturesLibrary
Consulta también Archivos y carpetas de las bibliotecas de música, imágenes y vídeos.
KnownFolders.PicturesLibrary
Vídeos videosLibrary
Consulta también Archivos y carpetas de las bibliotecas de música, imágenes y vídeos.
KnownFolders.VideosLibrary
Dispositivos extraíbles removableStorage

Nota: Debe incluir en el manifiesto de la aplicación aquellas asociaciones de tipo de archivo que declaren los tipos de archivo concretos a los que la aplicación tiene acceso en esta ubicación.

Consulta también Acceso a la tarjeta SD.
KnownFolders.RemovableDevices
Bibliotecas de Grupo Hogar Se necesita al menos una de las siguientes funcionalidades.
- musicLibrary
- picturesLibrary
- videosLibrary
KnownFolders.HomeGroup
Dispositivos de servidores multimedia (DLNA) Se necesita al menos una de las siguientes funcionalidades.
- musicLibrary
- picturesLibrary
- videosLibrary
KnownFolders.MediaServerDevices
Carpetas UNC (convención de nomenclatura universal) Se necesita una combinación de las siguientes funcionalidades.

Funcionalidad de redes doméstica y de trabajo:
- privateNetworkClientServer

Y al menos una funcionalidad de Internet y redes públicas:
- internetClient
- internetClientServer

Además, si procede, la funcionalidad de credenciales de dominio:
- enterpriseAuthentication

Nota: Nota: debe agregar en el manifiesto de su aplicación aquellas asociaciones de tipo de archivo que declaren los tipos de archivo concretos a los que su aplicación tiene acceso en esta ubicación.
Una carpeta se recupera mediante:
StorageFolder.GetFolderFromPathAsync

Un archivo se recupera mediante:
StorageFile.GetFileFromPathAsync

Ejemplo

Este ejemplo agrega la funcionalidad broadFileSystemAccess restringida. Además de especificar la funcionalidad, se debe agregar el espacio de nombres rescap, que también se agrega a IgnorableNamespaces.

<Package
  ...
  xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
  IgnorableNamespaces="uap mp rescap">
...
<Capabilities>
    <rescap:Capability Name="broadFileSystemAccess" />
</Capabilities>

Nota

Para obtener una lista completa de funcionalidades de la aplicación, consulte Declaraciones de funcionalidades de las aplicaciones.