在 Xamarin 上将流写入文件崩溃 iOS8

Writing stream to file crashes on Xamarin iOS8

我正在创建一个 HttpWebRequest 来下载文件。

HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);

现在成功了,我得到了响应流并尝试将其写入文件。

Stream responseStream = myHttpWebRequest.GetResponseStream();
DirectoryInfo di = new DirectoryInfo(url);
string documents = "";
if(UIDevice.CurrentDevice.CheckSystemVersion(8,0))
    documents = NSFileManager.DefaultManager.GetUrls(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomain.User)[0].ToString();
else
    documents = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); // iOS 7 and earlier

var filename = Path.Combine(documents, di.Name);
FileStream fstr = new FileStream(filename, FileMode.OpenOrCreate,FileAccess.Write);
responseStream.CopyTo(fstr);

iOS7 的代码运行良好。但是在 iOS8 条件下,我得到的文档和文件名是 "file:///Users/bharathkamath/Library/Developer/CoreSimulator/Devices/1FC25FA1-835A-414B-81FD-34B58F9EC16E/data/Containers/Data/Application/C70F4B4D-1DBB-427C-8CF7-2A09967A864C/Documents/4 QA doc 15.docx",这是一个有效的文件路径。 (我检查了文件夹结构。)

现在当我创建一个新的文件流时,我得到一个异常,一些子文件夹丢失了,因为路径现在已经更改为

/Users/bharathkamath/Library/Developer/CoreSimulator/Devices/1FC25FA1-835A-414B-81FD-34B58F9EC16E/data/Containers/Bundle/Application/9D9D6488-25C1-4F1A-8F3D-

/Containers/Data/已更改为/Containers/Bundle/

知道为什么新的 FileStream 会改变路径吗?

编辑:例外情况

Unhandled Exception:  ​System.IO.DirectoryNotFoundException: Could not find a part of the path "/Users/bharathkamath/Library/Developer/CoreSimulator/Devices/1FC25FA1-835A-414B-81FD-34B58F9EC16E/data/Containers/Bundle/Application/3B84B11D-CF99-41A5-BBA5-1B170B0A9574/RBCPPLMobileiOS.app/file:///Users/bharathkamath/Library/Developer/CoreSimulator/Devices/1FC25FA1-835A-414B-81FD-34B58F9EC16E/data/Containers/Data/Application/E214C51F-3260-455A-850E-7C3C5A5E9460/Documents/test.docx".

目录是正确的,因为 iOS 8 模拟器已经改变了文件结构,如您所见。但我认为您的代码的问题在于这一行:

documents = NSFileManager.DefaultManager.GetUrls(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomain.User)[0].ToString();

在行尾调用 "ToString()" 方法。 "ToString()" 将 return 以 "file://" 开头的文件路径。然后稍后您尝试使用 C# (Mono) 使用 FileStream 复制文件。好吧,C# (Mono) 不喜欢它以 "file://" 开头的路径。所以你必须摆脱它。

最简单的方法是调用“.Path”属性 而不是“.ToString()”方法。这将 return 路径中没有 "file://"。

documents = NSFileManager.DefaultManager.GetUrls(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomain.User)[0].Path;

这应该是 C# 喜欢的格式并且应该按预期工作。不要忘记关闭您的文件流,以便写入文件。