选择用于在Xamarin表单中存储文件的路径

Ahm*_*mel 6 c# xamarin.forms

我有一个Xamarin表单应用程序,我想保存文件,并且当用户在手机中打开文件管理器或手机连接到计算机时,应该显示该文件。我读了这篇文章,但问题是文件存储到Environment.SpecialFolder.Personal该位置,并且用户无法打开此路径。我也发现这个插件做的完全一样。它将文件存储到路径Environment.SpecialFolder.Personal。当我尝试将文件保存在另一个位置时,总是出现错误消息:

拒绝访问路径“ ..”

我应该使用哪个路径保存文件?

Dav*_*koř 5

System.Environment.SpecialFolder.Personal类型映射到的路径/data/data/[your.package.name]/files。这是应用程序的专用目录,因此,除非它具有root特权,否则您将无法使用文件浏览器查看这些文件。

因此,如果您希望用户找到该文件,则不能将文件保存在该Personal文件夹中,而是保存在另一个文件夹(例如Downloads)中:

string directory = Path.Combine(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, Android.OS.Environment.DirectoryDownloads);
string file = Path.Combine(directory, "yourfile.txt");
Run Code Online (Sandbox Code Playgroud)

您还必须添加权限AndroidManifest.xml

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Run Code Online (Sandbox Code Playgroud)


sme*_*sme 5

以下是为 Android、iOS 和 UWP 保存图像的代码:

安卓:

public void SaveImage(string filepath)
{
    var imageData = System.IO.File.ReadAllBytes(filepath);
    var dir = Android.OS.Environment.GetExternalStoragePublicDirectory(
    Android.OS.Environment.DirectoryDcim);
    var pictures = dir.AbsolutePath;
    var filename = System.DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".jpg";
    var newFilepath = System.IO.Path.Combine(pictures, filename);

    System.IO.File.WriteAllBytes(newFilepath, imageData);
    //mediascan adds the saved image into the gallery
    var mediaScanIntent = new Intent(Intent.ActionMediaScannerScanFile);
    mediaScanIntent.SetData(Android.Net.Uri.FromFile(new Java.IO.File(newFilepath)));
    Xamarin.Forms.Forms.Context.SendBroadcast(mediaScanIntent);
}
Run Code Online (Sandbox Code Playgroud)

IOS:

public async void SaveImage(string filepath)
{
    // First, check to see if we have initially asked the user for permission 
    // to access their photo album.
    if (Photos.PHPhotoLibrary.AuthorizationStatus == 
        Photos.PHAuthorizationStatus.NotDetermined)
    {
        var status = 
            await Plugin.Permissions.CrossPermissions.Current.RequestPermissionsAsync(
                Plugin.Permissions.Abstractions.Permission.Photos);
    }
    
    if (Photos.PHPhotoLibrary.AuthorizationStatus == 
        Photos.PHAuthorizationStatus.Authorized)
    {
        // We have permission to access their photo album, 
        // so we can go ahead and save the image.
        var imageData = System.IO.File.ReadAllBytes(filepath);
        var myImage = new UIImage(NSData.FromArray(imageData));

        myImage.SaveToPhotosAlbum((image, error) =>
        {
            if (error != null)
                System.Diagnostics.Debug.WriteLine(error.ToString());
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,对于 iOS,我使用 Plugin.Permissions nuget 数据包来请求用户的许可。

UWP:

public async void SaveImage(string filepath)
{
    var imageData = System.IO.File.ReadAllBytes(filepath);
    var filename = System.DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".jpg";
    
    if (Device.Idiom == TargetIdiom.Desktop)
    {
        var savePicker = new Windows.Storage.Pickers.FileSavePicker();
        savePicker.SuggestedStartLocation = 
            Windows.Storage.Pickers.PickerLocationId.PicturesLibrary;
        savePicker.SuggestedFileName = filename;
        savePicker.FileTypeChoices.Add("JPEG Image", new List<string>() { ".jpg" });

        var file = await savePicker.PickSaveFileAsync();

        if (file != null)
        {
            CachedFileManager.DeferUpdates(file);
            await FileIO.WriteBytesAsync(file, imageData);
            var status = await CachedFileManager.CompleteUpdatesAsync(file);

            if (status == Windows.Storage.Provider.FileUpdateStatus.Complete)
                System.Diagnostics.Debug.WriteLine("Saved successfully"));
        }
    }
    else
    {
        StorageFolder storageFolder = KnownFolders.SavedPictures;
        StorageFile sampleFile = await storageFolder.CreateFileAsync(
            filename + ".jpg", CreationCollisionOption.ReplaceExisting);
        await FileIO.WriteBytesAsync(sampleFile, imageData);
    }
}
Run Code Online (Sandbox Code Playgroud)


Ahm*_*mel 0

对于Android, @David Mo\xc5\xa1ko\xc5\x99的答案非常有效。

\n

对于IOS,我们可以使用以下路径:

\n
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "..", "Library"); \n
Run Code Online (Sandbox Code Playgroud)\n

LSSupportsOpeningDocumentsInPlace必须Supports Document Browser在 IOS 项目的文件中启用Info.plist和 才能使用户浏览保存的文件(当您打开Files应用程序并导航到On My iPhone时,它会出现)

\n