【问题标题】:Deleting a file in C#在 C# 中删除文件
【发布时间】:2009-02-20 22:19:29
【问题描述】:

似乎它应该是一个非常简单的话题,所有的例子都只是几行但没有像样的解释,因此我一直在没有解决方案的情况下遇到同样的错误。

简而言之,这部分应用程序是这样运行的

  1. 从数据库中拉取图片
  2. 在临时文件夹中创建实际图像文件
  3. 创建包含图片的 pdf
  4. 现在删除已创建的图像。

在删除之前一切正常。我不断收到错误

InnerException:
System.ArgumentException:不支持 URI 格式。 在 System.IO.Path.NormalizePathFast(String path, Boolean fullCheck)...

我尝试了几种不同的方法来完成删除最新的存在:

foreach (string item in TempFilesList)
    {
        path = System.Web.HttpContext.Current.Application["baseWebDomainUrl"] + "/temp/" + item;
        fileDel = new FileInfo(path);
        fileDel.Delete();
    }

之前的尝试是:

foreach (string item in TempFilesList)
    {
        File.Delete(System.Web.HttpContext.Current.Application["baseWebDomainUrl"] + "/temp/" + item);
    }

TempFilesList 是一个数组列表,包含要删除的图像的路径。

【问题讨论】:

    标签: c# asp.net file


    【解决方案1】:

    您应该尝试调用 Server.MapPath(path) 来获取文件的“真实”路径。将其传递给 File.Delete,它应该可以工作(假设文件权限等是正确的)

    例如:

    foreach (string item in TempFilesList)
    {
        path = System.Web.HttpContext.Current.Application["baseWebDomainUrl"] + "/temp/" + item;
        path = Server.MapPath(path);
        fileDel = new FileInfo(path);
        fileDel.Delete();
    }
    

    【讨论】:

      【解决方案2】:

      您需要所创建文件的实际文件路径,而不是所创建路径的 URL。您的代码会创建一个类似于“http://www.mywebsite.com/location/temp/filename.jpg”的路径。

      您需要类似“C:\MyWorkingFolder\filename.jpg”的内容。

      不过,我建议不要使用 Server.MapPath。由于您是在自己的代码中自己创建文件,因此您可以控制创建文件的位置。改用那个。将其作为 AppSettings 键存储在 web.config 中。

      例如:

      string basePath = ConfigurationManager.AppSettings["PdfGenerationWorkingFolder"];
      foreach(string item in TempFilesList)
      {
        File.Delete(basePath + item);
      }
      

      【讨论】:

      • 为什么要避免使用 Server.MapPath()?
      • 好吧,文件绝对没有理由需要服务器可寻址,而 Server.MapPath 仅适用于 Web 可寻址文件。事实上,任何称职的系统管理员都会拒绝 Web 服务器在其下执行对 Web 可寻址任何内容的写访问权限的用户。
      • 我同意,大多数文件(当然还有临时文件)不应该写在 web 根目录下,我认为 MapPath 可能还有另一个问题..
      【解决方案3】:

      对于 Windows 系统,您可以使用 \ 而不是 / 来分隔路径中的文件夹。要让代码在任何平台上运行,请使用Path.Combine 方法将路径放在一起:

      path = Path.Combine(Path.Combine(System.Web.HttpContext.Current.Application["baseWebDomainUrl"], "temp"), item);
      

      【讨论】:

        【解决方案4】:

        也许使用Server.MapPath(path) 会有所帮助?

        foreach(string item in TempFilesList)
        {
          string path = String.Format("{0}/temp/{1}", HttpContext.Current.Application["baseWebDomainUrl"], item);
          File.Delete(Server.MapPath(path));
        }
        

        最好使用静态File.Delete() 而不是创建新的 FileInfo(path) 只是为了删除

        【讨论】:

          【解决方案5】:

          您使用的是什么 pdf-creater-tool?您是否检查过它是否支持流作为输入参数?那么您不必将图像临时写入文件..并且孔问题消失了...-顺便说一句,我投票给 Randolphos 答案:p

          【讨论】:

            【解决方案6】:

            如果您保存了图像,则必须使用文件路径来执行此操作。你不能只使用相同的文件路径来删除它们吗?这意味着您可以避免两次文件路径的任何连接。 (附带说明:您可能应该使用 Path.Combine)

            【讨论】:

              【解决方案7】:

              我只会添加这个,以防你希望它进入回收站而不是把它炸毁:

              FileSystem.DeleteFile(file.FullName, UIOption.OnlyErrorDialogs, RecycleOption.SendToRecycleBin, Microsoft.VisualBasic.FileIO.UICancelOption.DoNothing);
              

              唯一糟糕的是在你的 C# 中你必须引用一个 VisualBasic 命名空间

              using Microsoft.VisualBasic.FileIO;
              

              在您的情况下,您甚至可能不需要 bin,因为它在数据库中,但我想我会把它扔在那里。

              【讨论】:

                猜你喜欢
                • 2020-03-20
                • 1970-01-01
                • 1970-01-01
                • 2017-01-06
                • 1970-01-01
                • 2013-07-11
                • 2011-05-19
                • 2010-10-18
                相关资源
                最近更新 更多