2017-03-08 93 views
1

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

我找到了Xamarain.Android和iOS的解决方案,但我想将它合并到一个Portable类中。

编辑
也许有更好的解决方案在那里,但这里是我与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(); 

回答

0

为了避免处理不同的文件系统和他们在每个平台上的怪癖,你可以使用PCLStorage库做业务相当广泛的阵列上的所有Xamarin.Forms平台。

它到这里看看:https://github.com/dsplaisted/PCLStorage

+0

谢谢,我把它与复制流合作。 –

1

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

例如,在PCL创建一个接口

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

在安卓平台相关的实施

[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"); 
+0

谢谢你的回复。但我想要共享代码中的逻辑。 –

0

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

您也可以使用共享项目而不是PCL,因为X.IOS和X.Android都包含System.IO.File支持,它可以在共享项目中非常无缝地工作。否则,如果您使用Xamarin Forms,我认为Alessandro的DependencyService解决方案是一个很好的解决方案,即使您没有使用Forms,界面抽象概念也适用。

+0

我会看看“酷新方式”,谢谢 –