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

时间:2015-02-25 22:35:27

标签: ios8 xamarin filestream

我正在创建一个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".

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

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