0

如果我尝试DidPickDocumentUIDocumentPickerViewController所选文件导入/写入应用程序的本地 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 做到这一点?

4

2 回答 2

0

由于您已获得 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();

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

于 2018-04-23T16:06:06.857 回答
0
  • 为什么不直接将文件克隆到 Documents 目录,然后再读取它而不是反序列化内容并重新序列化它们?
  • 你的代码似乎真的很低效。如果您的文件可以是 400MB,那么您显然不应该将所有内容都加载到内存中。我猜你的文件中必须有非常大的二进制对象,如果它们可以是 400MB 的话;尝试映射文件并存储指向单个对象的指针?
于 2018-04-23T08:06:46.383 回答