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

Xamarin iOS DocumentPicker: How to import large files?

UIDocumentPickerViewControllerDidPickDocument 事件中,我尝试将所选文件 import/write 放入应用程序的本地文档目录中。 使用 subclassed UIDocument class 与 overriden

这适用于 "small" 文件(例如 < 100MB)
 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),由于内存 (RAM) 不足,应用程序会在调用 LoadFromContents 之前崩溃。

所以需要有一种方法所选文件直接到文件。 你如何使用给定的 NSUrl 来做到这一点?

  • 为什么不在读取文件之前将文件克隆到您的 Documents 目录,而不是反序列化内容并重新序列化它们?
  • 你的代码看起来效率很低。如果你的文件可以是 400MB,你显然不应该将所有内容加载到内存中。我猜你的文件中一定有非常大的二进制对象,如果它们可以达到 400MB;尝试映射文件并存储指向单个对象的指针?

既然你已经得到了url,就没有必要将它转换成NSData然后将数据存储到一个文件中。我们可以将 url 与 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();

这样我们就可以把文件存放到我们app自己的文档目录下了。