2012-10-21 41 views
0

這裏指出錯誤值是從我的節目directoryInfo.Name顯示在同一時間

public partial class Form1 : Form 
{ 
    DirectoryInfo tempdirectory = new DirectoryInfo(@"\temp"); 
    const string DEFAULT_ADDRESS_TEXT = "<click load button to load a file>"; 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     lblAddress.Text = DEFAULT_ADDRESS_TEXT;    
     if (Directory.Exists(tempdirectory.Name)) 
     { 
      lblAddress.Text = tempdirectory.FullName; 
      foreach (DirectoryInfo dir in tempdirectory.GetDirectories()) 
      { 
       dir.Delete(true); 
      } 
      foreach (FileInfo file in tempdirectory.GetFiles()) 
      { 
       file.Delete(); 
      } 
     } 
     Directory.CreateDirectory(tempdirectory.Name); 
     lblAddress.Text = tempdirectory.Name; 
    } 
} 

程序運行位置的方法(PRL) - > G:\用戶\\文檔\ Visual Studio 2010的\ Projects \ Comics Project \ ZipEntryDemo2 \ ZipEntryDemo2 \ bin \ Debug

在程序的第一次運行中,名爲temp的文件夾將在程序位置(PRL \ temp)創建。 關閉應用程序並再次運行後,在第一步創建的臨時目錄不爲空;而是lblAddress顯示值G:\ temp;實際上甚至不存在。

然後我明確地創建了一個文件夾G:\ temp,並在其中放置了一些額外的文件和文件夾,出於測試目的,程序現在從G:\ temp中刪除所有文件和文件夾,並且PRL \ temp仍然如此與所有內容。

實際上,我的程序將臨時文件夾的位置(即PRL \ temp)傳遞給提取該文件夾中的內容的方法。在每次運行中,內容總是在PRL \ temp中提取; 但如果該文件夾存在,則G:\ temp的內容會丟失。

另一個奇怪的事情是,如果條件語句未執行且程序在正確的位置(即PRL \ temp)創建了一個文件夾,那麼當我在第一次運行時由於temp目錄不存在而在PRL中進行調試時。 這只是文件和文件夾檢查錯誤的文件夾G:\臨時

我沒有得到像文件夾已經存在或任何類型的異常,直到現在。

我還注意到,如果我將「\ temp」更改爲「temp」,現在所有的事情都發生在正確的位置,即PRL \ temp;中間沒有G:\ temp。我的程序工作正常。但我覺得它很奇怪,並會很感激,如果有人可以解釋這一點。謝謝,對不起,如果這是一個非常愚蠢的問題,這是我的一些IO經驗。

它調用解壓methos的方法是

private void btnLoad_Click(object sender, EventArgs e) 
    { 
     OpenFileDialog f = new OpenFileDialog(); 
     f.Filter = "Zip Files(*.zip)|*.zip"; 
     f.Multiselect = false; 
     if (f.ShowDialog() == DialogResult.OK) 
     { 
      unzip(f.FileName, tempdirectory.Name, 4096); 
     } 
    } 

這裏tempDirectory.Name傳遞給解壓縮功能,它並沒有在該方法得到操縱。 4096是緩衝區大小,無關緊要。

+0

是的,我知道許多機器上沒有try-catch塊會破壞代碼,但這只是一個提取文件的測試程序。我的問題是爲什麼它刪除一個文件夾的內容並提取正確的文件夾。 –

回答

1

這些都是出問題的時候的那種東西您不指定完整的路徑名稱。當你開始時只有簡單的temp,第二個當你將它改爲\temp時,你得到了第一個「temp」目錄。由於它沒有指定驅動器,因此它仍然不是完整的路徑名稱。

這段代碼也不太可能在開發機器以外的其他機器上存活,您不能在驅動器根目錄中任意創建目錄。 UAC可以防止創建類似的目錄和文件。你需要一個安裝程序來創建這樣的目錄,只有它有足夠的權限。

相反,Windows程序應該使用appdata文件夾,您可以使用Environment.GetFolderPath()獲取appdata目錄的路徑。如果這些文件夾和文件本質上是真正的臨時文件,換句話說,您只需要它們用於進程的整個生命週期,或者在重新啓動時不需要它們,那麼您應該使用System.IO.Path.GetTempPath()來獲取用戶臨時目錄的完整路徑名稱。

+0

「你不能在驅動器的根目錄中任意創建目錄」,不知道,謝謝! –

3

\temp將使用當前目錄的根目錄(在這種情況下爲G)。

您應該使用Application.StartupPath()來獲取應用程序的路徑。 然後Path.Combine(startupPath, tempPath)您可以使用它來創建和加載DirectoryInfo

還要考慮使用您的計算機環境的實際臨時文件夾:

串tmpFolder = Environment.GetFolderPath(Environment.SpecialFolder。用戶資料);

對不起,應該是:

tmpFolder = System.IO.Path.GetTempPath; 

此外,刪除該文件夾中的所有文件,你可以使用這個方法:

IO.Directory.Delete(tmpFolder, true); 
+0

是的,我檢查了額外的斜線,但事情是爲什麼我的工作文件夾仍然是程序的臨時目錄。我最初使用Environment.CurrentDirectory保存,但更改爲此表單。 –

+0

\將強制進入根。 CD不一定與程序文件夾相同。如果你通過f.ex去。資源管理器到程序文件夾並從那裏啓動該exe,CD將最初與程序文件夾相同。但是,如果您開始鏈接(即快捷方式)或相對路徑,CD很可能與程序文件夾不同。 Application.StartupPath將保證您獲得程序啓動路徑(使用Env..SetCD將要求您知道程序啓動路徑)。但對於臨時文件,環境溫度是IMO的更好選擇。 – K3N

+0

好的,現在這是我不知道的。至於臨時路徑,實際上這只是一個測試程序。我最初的問題是爲什麼它顯示不同的值。 –