从文件夹中获取文件到列表,将子目录添加到下拉列表并列出列表中的文件名

时间:2013-10-08 21:11:36

标签: c# file loops combobox listbox

首先看一下这个截图,看看会发生什么:

User interface screenshot

你在这个截图中看到的是我已经做过的事情..但我想补充一些其他内容。

现在点击"添加到列表"按钮将所有文件及其完整路径存储在列表A中。它们的文件名存储在列表B中。以下是代码:

 if (type == "folder")
                {
                    string listPath = this.configsPath.Text;
                    string[] filesToList = System.IO.Directory.GetFiles(listPath, "*.*", System.IO.SearchOption.AllDirectories);
                    foreach (string file in filesToList)
                    {
                        if (!configsChkList.Items.Contains(file))
                        {
                            configsChkList.Items.Add(file, false);
                            configsDestList.Items.Add(Path.GetFileName(file));
                        }
                    }
                }

我希望List b也存储它们相对于输入字段中指定的路径的路径。作为示例,列表A中的最后三个条目位于名为" undermappe"的子目录中,但是因为我使用Path.GetFileName来存储列表B中的条目,所以子目录不会被查看..我该怎么做?

然后另一件事。子目录也应该存储在顶部的ComboBox中,但只存储名称的目录!我怎么能这样做?

4 个答案:

答案 0 :(得分:0)

我没有写这个(所以我不会赞成),但是这个函数返回相对路径:

    /// <summary>
    /// method to provide a relative path from a directory to a path
    /// </summary>
    /// <param name="fromDirectory">the starting folder</param>
    /// <param name="toPath">the path that will be pointed to</param>
    /// <returns>string</returns>
    public static string RelativePathTo(string fromDirectory, string toPath)
    {

        if (fromDirectory == null)
        {
            throw new ArgumentNullException("fromDirectory");
        }

        if (toPath == null)
        {
            throw new ArgumentNullException("fromDirectory");
        }

        if (System.IO.Path.IsPathRooted(fromDirectory) && System.IO.Path.IsPathRooted(toPath))
        {

            if (string.Compare(System.IO.Path.GetPathRoot(fromDirectory)
                , System.IO.Path.GetPathRoot(toPath), true) != 0)
            {
                throw new ArgumentException(
                    String.Format("The paths '{0} and '{1}' have different path roots."
                        , fromDirectory
                        , toPath));
            }

        }

        StringCollection relativePath = new StringCollection();
        string[] fromDirectories = fromDirectory.Split(System.IO.Path.DirectorySeparatorChar);
        string[] toDirectories = toPath.Split(System.IO.Path.DirectorySeparatorChar);

        int length = Math.Min(fromDirectories.Length, toDirectories.Length);
        int lastCommonRoot = -1;

        // find common root
        for (int x = 0; x < length; x++)
        {
            if (string.Compare(fromDirectories[x], toDirectories[x], true) != 0)
            {
                break;
            }

            lastCommonRoot = x;

        }

        if (lastCommonRoot == -1)
        {

            throw new ArgumentException(
                string.Format("The paths '{0} and '{1}' do not have a common prefix path."
                    , fromDirectory
                    , toPath));
        }

        // add relative folders in from path
        for (int x = lastCommonRoot + 1; x < fromDirectories.Length; x++)
        {
            if (fromDirectories[x].Length > 0)
            {
                relativePath.Add("..");
            }
        }

        // add to folders to path
        for (int x = lastCommonRoot + 1; x < toDirectories.Length; x++)
        {
            relativePath.Add(toDirectories[x]);
        }

        // create relative path
        string[] relativeParts = new string[relativePath.Count];
        relativePath.CopyTo(relativeParts, 0);
        string newPath = string.Join(System.IO.Path.DirectorySeparatorChar.ToString(), relativeParts);
        return newPath;

    }

我很抱歉,但我不明白你的第二个请求,但如果你问如何获取目录的名称,那么使用DirectoryInfo很容易

DirectoryInfo di = new DirectoryInfo(@"c\temp\en");
string s = di.Name;

答案 1 :(得分:0)

  

我希望List b也存储它们相对于输入字段中指定的路径的路径。作为示例的列表A中的最后三个条目位于名为“undermappe”的子目录中,但是因为我使用Path。 GetFileName存储列表B中的条目子目录无法查看..我该怎么做?

只需删除前X个字符,其中X是输入字段中路径的长度。这可以使用Substring();类似的东西:

string relativePath = stringFromListBox.Substring(stringFromInputField.Length + 1);

“+ 1”应该摆脱领先的斜线。

答案 2 :(得分:0)

对于问题的第二部分,关于组合框中的路径,您可以获取每个完整的文件名,并使用Path.GetDirectoryName()来获取目录。

var files = new []{@"f:\Noter\Test\2004 ABC Musik.txt",@"f:\Noter\Test\activision_support.txt",@"f:\Noter\Test\Alberte.txt",@"F:\Noter\Test\undermappe\steam password!.txt"};

var folders = files.Select(f => System.IO.Path.GetDirectoryName(f)).Distinct().ToList();

如果您只想要主'F:\noter\test'文件夹下的文件夹,那么只需在问题的第一部分的答案中使用相对路径代码

答案 3 :(得分:0)

             **Hi.
             try this example , i think this is what you need , 100% working:**


             System.String basefolder = "NASSIM\\LOUCHANI\\";

             foreach (String file in Directory.GetFiles(basefolder,"*.*"))
             {
                 comboBox1.Items.Add(Path.GetFileNameWithoutExtension(file));
                 //Load file name without extension / path.
             }