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

Xamarin iOS DocumentPicker:如何导入大型文件?,ios,xamarin,uidocument,uidocumentpickerviewcontroller,Ios,Xamarin,Uidocument,Uidocumentpickerviewcontroller,在UIDocumentPickerViewController的DidPickDocument事件中,我尝试将所选文件导入/写入应用程序的本地文档目录。 这可以很好地处理“小”文件(例如

UIDocumentPickerViewController
DidPickDocument
事件中,我尝试将所选文件导入/写入应用程序的本地文档目录。 这可以很好地处理“小”文件(例如<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),则由于内存(RAM)不足,在调用
LoadFromContents
之前,应用程序会崩溃

因此,需要有一种方法将所选文件直接流式传输到文件。 如何使用给定的NSUrl实现这一点?

  • 为什么不在读取之前将文件克隆到文档目录,而不是对内容进行反序列化和重新序列化
  • 你的代码似乎效率很低。如果您的文件可以是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();
通过这种方式,我们可以将文件存储到应用程序自己的文档目录。

我专注于UiDocument(在访问各种网站(如xamarin网站)上的文档选择器返回的文件时建议使用UiDocument),因此我没有看到使用StartAccessingSecurityScopedResource和从a到b的简单拷贝的简单解决方案。