我想使用以下代码将.xml文件写入App_Data / posts。为什么会导致错误?
Stream writer = new FileStream("..'\'App_Data'\'posts'\'" + new Guid(post_ID.ToString()).ToString() + ".xml", FileMode.Create);
答案 0 :(得分:18)
请发布您获得的例外情况;不只是“它不起作用” - 这可能是各种各样的问题。以下是一些要检查的事项:
检查ASP.NET进程是否具有该目录的写访问权。
此外,您似乎正在逃避路径中的退格错误。在使用ASP.NET时,您的路径应该相对于应用程序根目录。试试这个:
string path = HttpContext.Current.Server.MapPath("~/App_Data/posts/" + new Guid(post_ID.ToString()).ToString() + ".xml"
Stream writer = new FileStream(path, FileMode.Create);
最后,确保posts目录存在 - 或者文件创建失败。
答案 1 :(得分:7)
删除无关的单引号并正确转义反斜杠。
甚至更好,使用Server.MapPath
(在Page和UserControl基类和HttpContext中可用)。
Server.MapPath("~/App_Data/posts/" + new Guid(post_ID.ToString()).ToString() + ".xml")
出于好奇,post_ID的类型是什么?为什么要将它转换为字符串,然后转换为guid,然后再转换为字符串?
答案 2 :(得分:0)
上述答案很好,但它们依赖于 System.Web 程序集。
如果您在库中创建文件创建方法,那么 Server.MapPath 将不可用。
在这种情况下,您甚至可以使用更通用的说法将数据写入 App_Data 文件夹。
我们使用 App_data 文件夹是因为黑客无法使用 http/https 网址访问 app_data 文件夹中的文件(例如 http://yourwebsite.com/app_data/test.xml
var rootDirectory = AppDomain.CurrentDomain.BaseDirectory;
var folderNameToBecreated = "posts"; //
var finalDirectoryPath = System.IO.Path.Combine(rootDirectory, "App_Data", folderNameToBecreated);
var filename = Guid.NewGuid().ToString() + ".txt";
//Create Directory if not exists
if (System.IO.Directory.Exists(finalDirectoryPath) == false)
{
System.IO.Directory.CreateDirectory(finalDirectoryPath);
}
var fullFilePath = System.IO.Path.Combine(finalDirectoryPath, filename);
//testing your written file
using (System.IO.StreamWriter sw = new System.IO.StreamWriter(fullFilePath, true))
{
sw.WriteLine("This is a test file");
}