2014-10-02 139 views
0

我正在使用C#。我的代碼段,返回文件以及特定文件類型的路徑,並把它們選擇列表隱藏文件路徑並僅顯示文件名

private void Form1_Load(object sender, EventArgs e) 
    { 
     // Only get .sde files 
     string[] dirs = System.IO.Directory.GetFiles(@"c:\Users\JohnDoe\Desktop\my_files", "*.sde"); 
     this.GetSdePath.Items.AddRange(dirs); 
    } 

裏面當我運行我的程序,選擇列表中包含了所有的SDE文件。它們列/顯示爲這樣:

C:\用戶\ JOHNDOE \桌面\ my_files \ NewCreated.sde
C:\用戶\ JOHNDOE \桌面\ my_files \ Inventory.sde
C:\用戶\ JOHNDOE \桌面\ my_files \ Surplus.sde
C:\用戶\ JOHNDOE \桌面\ my_files \ Logistics.sde

我想知道如果我在選擇列表是有可能隱藏的路徑,只是顯示的名稱sde文件。因此,該列表看起來像

NewCreated.sde
Inventory.sde
Surplus.sde
Logistics.sde

,但在列表將返回完整路徑和名稱每個值。
任何有關這個主題的幫助將不勝感激。提前致謝。

回答

1

的順序使用Select返回到應用Path.GetFileName方法從FULLPATH

var dirs = System.IO.Directory.GetFiles(@"c:\Users\JohnDoe\Desktop\my_files", "*.sde") 
           .Select (d => Path.GetFileName(d)); 
this.GetSdePath.Items.AddRange(dirs.ToArray()); 

我不知道有多少文件都存在你的文件夾中提取不僅是文件名,但可能是更好的使用EnumerateFiles代替的GetFiles

var dirs = System.IO.Directory.EnumerateFiles(@"c:\Users\JohnDoe\Desktop\my_files", "*.sde") 
           .Select (d => Path.GetFileName(d)); 

MSDN說

EnumerateFiles和GetFiles方法的區別如下:當您使用EnumerateFiles 時,可以在返回整個集合之前開始枚舉名稱集合 ;當您使用GetFiles時, 必須等待返回整個數組名稱,然後才能訪問數組。因此,當您使用多個文件和 目錄時,EnumerateFiles可以更高效。

編輯
繼EnumerateFiles的選擇下面您的意見是不可能的(可從.NET 4.0),如果你想保持的全路徑名可用於其他任務,但只顯示在列表框中的文件名那麼你需要保持它在某種集合(數組或更好的列表)的

using System.IO; 
... 

string sourcePath = @"c:\Users\JohnDoe\Desktop\my_files"; 
List<string> dirs = Directory.GetFiles(sourcePath, "*.sde") 
           .Select (d => Path.GetFileName(d) 
           .ToList()); 
this.GetSdePath.Items.AddRange(dirs.ToArray()); 
           ; 

List<string>dirs形式級變量,如果你需要的Form_Load事件以外的內容

+0

感謝您爲您的文章,但我相信我有同樣的問題,下面我的意見。我正在使用Framework 3.5。我正在看MSDN,看看我是否可以爲我的框架修改代碼。 – user1898629 2014-10-02 22:40:08

+0

我能夠讓你的代碼工作。我唯一的問題是,爲了讓我的程序工作,它必須採取整個文件路徑,包括文件名。所以它將不得不採取「C:\用戶\ JohnDoe \ my_files \ Surplus.sde」工作(總不方便,我知道)。我使用了一個消息框來返回值,它只是向我展示了「Surplus.sde」。我可能不得不將這個值與路徑連接起來。更重要的是,選擇列表(comboBox)僅顯示名稱。再次感謝您的輸入。 – user1898629 2014-10-02 23:08:41

+0

如果你想保留完整的路徑名可用於其他任務,但只顯示列表框中的文件名,那麼你需要保持它在某種集合(一個數組或更好的列表)該變量應該是一個全球性的,如果你需要這個信息在Form_Load事件之外或只是一個本地的。 – Steve 2014-10-03 07:06:29

1

使用Path.GetFileName(string path)

private void Form1_Load(object sender, EventArgs e) 
    { 
     // Only get .sde files 
     string[] dirs = System.IO.Directory.GetFiles(@"c:\Users\JohnDoe\Desktop\my_files", "*.sde"); 
     this.GetSdePath.Items.AddRange(dirs.Select(path => Path.GetFileName(path).ToArray()); 
    } 
+0

我非常感謝你的帖子。我正在使用.NET Framework 3.5。我認爲我的框架可能與您的示例不兼容,因爲某些關鍵字未出現在Intellisense中,即Path.GetFileName中。我知道,我應該儘快「升級」。我正在看MSDN,看看我是否可以爲我的框架修改代碼。 – user1898629 2014-10-02 22:37:44

+0

那麼我也錯過了「使用system.io」。補充說,但我無法獲得代碼的工作。得到一些錯誤。 (1)錯誤'System.Windows.Forms.ComboBox.ObjectCollection.AddRange(object [])'的最佳重載方法匹配有一些無效參數....(2)錯誤參數1:can not從'System.Collections.Generic.IEnumerable '轉換爲'object []' – user1898629 2014-10-02 22:58:26