首先看一下这个截图,看看会发生什么:
你在这个截图中看到的是我已经做过的事情..但我想补充一些其他内容。
现在点击"添加到列表"按钮将所有文件及其完整路径存储在列表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中,但只存储名称的目录!我怎么能这样做?
答案 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.
}