【问题标题】:Hide file path and only display the file name隐藏文件路径,只显示文件名
【发布时间】:2014-10-02 21:56:23
【问题描述】:

我正在使用 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:\Users\JohnDoe\Desktop\my_files\NewCreated.sde
c:\Users\JohnDoe\Desktop\my_files\Inventory.sde
c:\Users\JohnDoe\Desktop\my_files\Surplus.sde
c:\Users\JohnDoe\Desktop\my_files\Logistics.sde

我想知道在我的选择列表中是否可以隐藏路径并仅显示 sde 文件的名称。所以列表看起来像

NewCreated.sde
库存.sde
盈余.sde
物流.sde

但是,列表中的每个值都会返回完整的路径和名称。
对此主题的任何帮助将不胜感激。提前致谢。

【问题讨论】:

    标签: c# combobox filepath


    【解决方案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());
        }
    

    【讨论】:

    • 非常感谢您的帖子。我正在使用 .NET Framework 3.5。我认为我的框架可能与您的示例不兼容,因为 Intellisense 中没有出现一些关键字,即 Path.GetFileName。我知道,我应该尽快“升级”。我正在查看 MSDN,看看是否可以为我的框架修改您的代码。
    • 好吧,我也错过了“使用 system.io”。将其添加,但无法使代码正常工作。得到一些错误。 (1) 错误 1 ​​'System.Windows.Forms.ComboBox.ObjectCollection.AddRange(object[])' 的最佳重载方法匹配有一些无效参数 ....(2) 错误 2 参数 1:无法从 'System 转换.Collections.Generic.IEnumerable' 到 'object[]'
    【解决方案2】:

    在返回的序列上使用Select 以应用Path.GetFileName 方法,该方法仅从完整路径中提取文件名

    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 可以更高效。

    编辑
    在您的 cmets 下方选择 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());
                                  ;
    

    如果您需要 Form_Load 事件之外的内容,请将 List&lt;string&gt;dirs 设为表单级变量

    【讨论】:

    • 感谢您的帖子,但我相信我的问题与下面的评论相同。我正在使用框架 3.5。我正在查看 MSDN,看看是否可以为我的框架修改您的代码。
    • 我能够让您的代码正常工作。我唯一的问题是,为了让我的程序工作,它必须采用文件的整个路径,包括文件名。所以它必须采取“C:\ Users \ JohnDoe \ my_files \ Surplus.sde”才能工作(我知道完全不便)。我使用了一个消息框来返回值,它只显示了“Surplus.sde”。我可能必须将此值与路径连接起来。更重要的是,选择列表(组合框)只显示名称。再次感谢您的意见。
    • 如果您想保留完整路径名可用于其他任务但只在列表框中显示文件名,那么您需要将其保存在某种集合中(数组或更好的列表)变量如果您在 Form_Load 事件之外需要此信息或仅需要本地信息,则应该是全局的。
    • 如果使用 NET 3.5 则不能使用 EnumerateFiles,因为它可从 4.0 获得
    猜你喜欢
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 2012-10-24
    • 2020-09-22
    • 1970-01-01
    • 2018-04-05
    • 2016-07-20
    • 1970-01-01
    相关资源
    最近更新 更多