【问题标题】:Xamarin Copy File Cross PlatformXamarin 复制文件跨平台
【发布时间】:2019-10-08 16:24:17
【问题描述】:

是否可以在 Xamarin 跨平台中复制文件?例如将 SQLlite db3 从一个目录复制到另一个目录。我只能得到文件的路径。

我找到了适用于 Xamarain.Android 和 iOS 的解决方案,但我希望将它们组合到一个便携式类中。

编辑
也许有更好的解决方案,但这是我使用 PCL Sotrage 得到的。

        IFile file = FileSystem.Current.GetFileFromPathAsync(src).Result;
        IFolder rootFolder = FileSystem.Current.GetFolderFromPathAsync(dest).Result;
        IFolder folder = rootFolder.CreateFolderAsync("MySubFolder", CreationCollisionOption.OpenIfExists).Result;
        IFile newFile = folder.CreateFileAsync("TodoItem.db3", CreationCollisionOption.GenerateUniqueName).Result;

        Stream str = file.OpenAsync(FileAccess.ReadAndWrite).Result;
        Stream newStr = newFile.OpenAsync(FileAccess.ReadAndWrite).Result;

        byte[] buffer = new byte[str.Length];
        int n;
        while ((n = str.Read(buffer, 0, buffer.Length)) != 0)
            newStr.Write(buffer, 0, n);
        str.Dispose();
        newStr.Dispose();

【问题讨论】:

    标签: xamarin cross-platform


    【解决方案1】:

    我认为一个好的解决方案是使用DependencyService。

    例如,在 PCL 中创建一个接口

    public interface IFile {
        void Copy ( string fromFile, string toFile );
    }
    

    在 Android 中特定于平台的实现

    [assembly: Xamarin.Forms.Dependency (typeof (FileImplementation))]
    namespace File.Droid {
      public class FileImplementation : IFile
      {
          public FileImplementation() {}
    
          public void Copy(string fromFile, string toFile)
          {
                System.IO.File.Copy(fromFile, toFile);
          }
    
      }
    }
    

    然后在你的 PCL 中你可以调用

    DependencyService.Get<IFile>().Copy("myfile", "newfile");
    

    使用 .NETStandard,您可以直接在 PCL 项目中使用 System.IO

    【讨论】:

    • 感谢您的回复。但我想在共享代码中有逻辑。
    【解决方案2】:

    一个很酷的新方法是使用 .Net 标准库而不是 PCL。 .Net Standard 1.6 在 Xamarin.IOS 和 Xamarin.Android 上受支持,并且包括 System.IO.File,这与 PCL 配置文件不同。

    您也可以使用共享项目而不是 PCL,因为 X.IOS 和 X.Android 都包含 System.IO.File 支持,因此它可以在共享项目中无缝运行。

    否则,如果您使用的是 Xamarin Forms,我认为 Alessandro 的 DependencyService 解决方案是一个不错的解决方案,即使您不使用 Forms,也适用于接口抽象思想。

    【讨论】:

      【解决方案3】:

      为避免在每个平台上处理不同的文件系统及其怪癖,您可以使用 PCLStorage 库在所有 Xamarin.Forms 平台上执行相当广泛的操作。

      在这里看看:https://github.com/dsplaisted/PCLStorage

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-03
        • 1970-01-01
        • 2017-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多