2012-04-02 252 views
15
using (var openFileDialog1 = new OpenFileDialog()) 
     { 
      openFileDialog1.Reset(); 
      if (!string.IsNullOrEmpty(ExcelFilePath)) 
      { 
       string fileName = Path.GetFileName(ExcelFilePath); 
       string fileExt = Path.GetExtension(ExcelFilePath); 
       //Avoid "you can't open this location using this program file" dialog 
       //if there is a file name in the path strip it) 
       if (!string.IsNullOrEmpty(fileName)) 
        initialDirectory = Path.GetDirectoryName(ExcelFilePath); 
     //if not let it be 
       else 
        initialDirectory = ExcelFilePath; 

      openFileDialog1.InitialDirectory = initialDirectory; 
      } 
      else 
       openFileDialog1.InitialDirectory = "c:\\"; 
      openFileDialog1.Filter = "Excel files (*.xls or *.xlsx)|*.xls;*.xlsx"; 
      //openFileDialog1.Filter = "xls files (*.xls)|*.xls|xlsx files(*.xlsx)|.xlsx"; 
      openFileDialog1.FilterIndex = 2; 
      openFileDialog1.RestoreDirectory = false; 
      openFileDialog1.CheckFileExists = true; 
      openFileDialog1.CheckPathExists = true; 
      if (openFileDialog1.ShowDialog() == DialogResult.OK) 
      { 
       var browseSelectionMade = BrowseSelectionMade; 
       if (browseSelectionMade!=null) 
        browseSelectionMade(this, new DataEventArgs<string>(openFileDialog1.FileName)); 
      } 
     } 

無論我是否將RestoreDirectory設置爲true,如果我的初始目錄設置爲不存在的路徑,我將始終瀏覽到LAST使用的目錄。 OpenFileDialog保存的最後一個使用目錄在哪裏?有沒有辦法來覆蓋這種行爲? (例如,如果初始目錄不存在,我總是希望將它設置爲C:\)OpenFileDialog默認路徑

回答

11

哪裏是最後使用的目錄保存?

它存儲在註冊表中。確切位置取決於Windows版本,對於Win7,它是HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ ComDlg32。用reregit快速查看應該說服你,你不要想惹的禍。

簡單的解決方法是提供一個有效的路徑。如果您計算的那個無效,Directory.Exists返回false,然後提供一個有效的。像Environment.GetFolderPath()返回的Documents文件夾一樣。然後,再次,上次使用的一個也沒什麼問題,用戶會很容易地識別出它碰巧接近所需的那個。

+0

感謝您的答覆,我會將您的答案標記爲已接受的答案,儘管第二個答案也很好。事實上,我最終確定了路徑的存儲位置,這對我來說是很有幫助的。再次感謝! – 2012-04-02 17:26:57

+0

Upvoting _Hans Passant_感覺如此毫無意義...... – itsho 2017-01-08 13:28:12

1

檢查ExcelFilePath是否存在,檢查它是否爲空或空,但是如果在您阻止之前檢查目錄是否存在,如果它沒有將值重置爲空字符串,則應該是黃金。

(是的,你需要等先申請文件名邏輯),但是一旦你解析的說了出來,這是微不足道的,以確定該目錄退出

if (!Directory.Exists(excelPath)) 
{ 
    ExcelFilePath = String.Empty; 
} 
24

好像你需要做的是以下幾點:

string path; // this is the path that you are checking. 
if(Directory.Exists(path)) { 
    openFileDialog1.InitialDirectory = path; 
} else { 
    openFileDialog1.InitialDirectory = @"C:\"; 
} 

這是除非我失去了一些東西。

+0

openFileDialog1.InitialDirectory = Directory.Exists(path)?路徑:@「C:\」; – 2017-08-28 04:09:58

3

我不認爲有什麼內置的。只是檢查你打開對話框之前:

if (!Directory.Exists(initialDirectory)) 
{ 
    openFileDialog1.InitialDirectory = @"C:\"; 
} 
0

如果你使用存儲在某些字符串的文件名,這是更好地使用路徑切的文件名(在我的W10的打開的對話框中不初始目錄中打開,如果我只是供應文件名):

if (!System.IO.Directory.Exists(filename)) 
    { 
     openDlg.InitialDirectory = 
      System.IO.Path.GetDirectoryName(filename); 
    } 
0

對於未來我

記得做:

  try   
      { 
       result = dialog.ShowDialog(Window); 
      } 
      catch 
      { 
       dialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); 
       result = dialog.ShowDialog(Window); 
      } 

這有助於在用戶從位置打開文件的情況下,該文件不再存在(例如, USB棒,映射網絡驅動器) - 如果InitialDirectory無效,ShowDialog會拋出異常。