2009-02-20 67 views
4

似乎它應該是一個非常簡單的主題,所有的例子無處不在,只是幾行,但沒有像樣的解釋,因此我一直沒有解決方案就遇到同樣的錯誤。在C中刪除一個文件#

總之廣告應用程式的這部分運行,像這樣

  1. 從數據庫
  2. 在臨時文件夾中創建實際圖像文件翻出圖像
  3. 與圖像這裏面
  4. 現在刪除創建PDF已創建的圖像。

一切工作到刪除。我不斷收到錯誤

的InnerException:
System.ArgumentException:URI格式不被支持。 在System.IO.Path.NormalizePathFast(字符串路徑,布爾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是一個數組列表,其中包含要刪除的圖像的路徑。

回答

13

您應該嘗試調用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(); 
} 
1

也許使用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(路徑)只是刪除

7

你需要,你所創建的文件的實際文件路徑,而不是路徑的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); 
} 
+0

爲什麼避免使用Server.MapPath()? – Nick 2009-02-20 22:59:36

1

你使用的是什麼PDF-創世工具?你有沒有檢查它是否支持一個流作爲輸入參數?那麼你不必將臨時圖像作爲一個文件寫出來......並且漏洞問題已經消失......-btw,我投Randolphos答案:p

0

如果你保存了圖像,你必須使用文件路徑來做到這一點。你不能只使用相同的文件路徑來刪除它們嗎?這將意味着你離開文件路徑的任何連接兩次。 (作爲旁註:您應該使用Path.Combine)

2

對於Windows系統,您可以使用\而不是/來分隔路徑中的文件夾。對於代碼的任何平臺上工作,使用Path.Combine方法把路徑在一起:

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

我纔剛剛在你想讓它擊中了回收站,而不是吹出來的存在的情況下,補充一點:

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

,吸的唯一的事情是,在C#中,您必須引用的VisualBasic命名空間

using Microsoft.VisualBasic.FileIO; 

在你的情況,你可能甚至不需要在b因爲它在數據庫中,但我認爲我會把它扔在那裏。