在 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# 喜欢的格式并且应该按预期工作。不要忘记关闭您的文件流,以便写入文件。
我正在创建一个 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# 喜欢的格式并且应该按预期工作。不要忘记关闭您的文件流,以便写入文件。