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;尝试映射文件并存储指向单个对象的指针
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的简单拷贝的简单解决方案。