Xamarin iOS DocumentPicker:如何导入大文件?
Xamarin iOS DocumentPicker: How to import large files?
在 UIDocumentPickerViewController
的 DidPickDocument
事件中,我尝试将所选文件 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自己的文档目录下了。
在 UIDocumentPickerViewController
的 DidPickDocument
事件中,我尝试将所选文件 import/write 放入应用程序的本地文档目录中。
使用 subclassed UIDocument class 与 overriden
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自己的文档目录下了。