Xamarin iOS DocumentPicker:如何导入大文件?

时间:2018-04-22 10:13:07

标签: ios xamarin uidocument uidocumentpickerviewcontroller

DidPickDocument UIDocumentPickerViewController事件中,我尝试将所选文件导入/写入应用程序的本地Documents目录。 这适用于“小”文件(例如<100MB),使用带有覆盖的子类UIDocument类

 public override bool LoadFromContents(NSObject contents, string typeName, out NSError outError)
    {

       outError = null;

        if (contents != null)
        {
            Content = ((NSData)contents).ToArray();

        }

...

...并致电

 MySubclassedDoc mySubclassedDoc = new MySubclassedDoc (nsurl);
 bool success = await mySubclassedDoc.OpenAsync();
 File.WriteAllBytes("targetFile.xyz", mySubclassedDoc.Content);

但是如果文件较大(例如400MB),则在调用LoadFromContents之前应用程序崩溃是因为内存不足(RAM)。

因此需要一种方法所选文件直接传输到文件。 你怎么能用给定的NSUrl做到这一点?

2 个答案:

答案 0 :(得分:0)

  • 为什么不在将文件复制到Documents目录之前将其复制到Documents目录中,而不是反序列化内容并重新序列化?
  • 您的代码似乎效率很低。如果您的文件可以是400MB,则显然不应将所有内容加载到内存中。我猜你必须在文件中有非常大的二进制对象,如果它们可以是400MB;尝试mmapping文件并存储指向各个对象的指针吗?

答案 1 :(得分:0)

由于您已获得网址,因此无需将其转换为NSData,然后将数据存储到文件中。我们可以将此网址与NSFileManager一起使用,如:

url.StartAccessingSecurityScopedResource();
string docPath = NSSearchPath.GetDirectories(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomain.User)[0];
string filePath = Path.Combine(docPath, "fileName.type");

NSError error;

NSFileManager fileManager = new NSFileManager();
fileManager.Copy(url.Path, filePath, out error);
url.StopAccessingSecurityScopedResource();

通过这种方式,我们可以将文件存储到我们应用程序自己的文档目录中。