将数据写入App_Data

8

我希望使用以下代码将一个 .xml 文件写入 App_Data/posts 文件夹中。为什么会导致错误?

代码

 Stream writer  = new FileStream("..'\'App_Data'\'posts'\'" + new Guid(post_ID.ToString()).ToString() + ".xml", FileMode.Create);

1
请您写下您所遇到的错误。 - Kronass
3个回答

21
请您提供您遇到的异常信息,而不仅仅是“它不能工作”-这可能是各种问题。以下是几个需要检查的事项:
请检查 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
我该如何检查ASP.NET对该目录具有写入访问权限? - aherlambang
同时它指出我没有MapPath的定义,因此MapPath被下划线标记。 - aherlambang
3
首先,您可以检查一下所得到的异常是否是 UnauthorizedException - 如果是的话,那就是权限问题。您在提问时应该将所获取到的异常信息一并附上。如果是权限问题,可以使用Windows资源管理器为App_Data文件夹授予IIS_WPG组的读/写权限。 - driis

8

去掉多余的单引号并正确转义反斜杠。

或者更好的方法是使用Server.MapPath(在Page和UserControl基类以及HttpContext等中可用)。

Server.MapPath("~/App_Data/posts/" + new Guid(post_ID.ToString()).ToString() + ".xml")

出于好奇,post_ID是什么类型?为什么要将它转换为字符串,然后再转换为guid,最后又转回字符串?


1
以上答案很好,但是它们依赖于System.Web程序集。
如果您在库内创建文件创建方法,则Server.MapPath将不可用。
在这种情况下,您甚至可以使用更通用的方法将数据写入App_Data文件夹。
我们使用App_data文件夹,因为黑客不能通过http / https url访问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");
            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接