0

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

用户界面截图

您可以在此屏幕截图中看到的是我已经完成的内容。但我想再添加一些内容。

现在通过单击“添加到列表”按钮,所有文件及其完整路径都存储在列表 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));
                        }
                    }
                }

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

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

4

4 回答 4

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.
             }
于 2015-01-22T00:01:22.273 回答
0

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

只需删除前 X 个字符,其中 X 是输入字段中路径的长度。这可以通过 Substring(); 来完成。就像是:

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

“+ 1”应该去掉前导斜线。

于 2013-10-08T22:37:24.510 回答
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;
于 2013-10-08T22:21:10.753 回答
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'文件夹,那么只需在问题的第一部分的答案中使用您的相对路径代码

于 2013-10-08T23:34:45.910 回答