我是字符串路径的一部分:100
我想在C:中搜索上面的路径,并且需要获取目录的完整路径。
我尝试使用"\MVVM\MyFirstTest2016\MyFirstTest\bin\Debug\MyFirstTest.exe"
和其他内置方法,但没有获得完整的完整路径。
答案 0 :(得分:0)
这是代码: sourceDir将是完整路径。
string defaultFolder = System.AppDomain.CurrentDomain.BaseDirectory;
string navigateToFolder = "\\MVVM\\MyFirstTest2016\\MyFirstTest\\bin\\Debug\\MyFirstTest.exe";
string sourceDir = Path.Combine(defaultFolder, navigateToFolder);
答案 1 :(得分:0)
听起来您的问题类似于this问题。你有一个部分路径,但不知道它在这个驱动器上的位置。天真的方法如下。
您的第一步是从驱动器的根目录开始,然后获取list of directories:
string[] dirs = Directory.GetDirectories(@"c:\", "*");
然后,检查这些字符串是否与根路径的第一个目录(MVVM)匹配。如果是,您将进入该文件夹并检查它是否包含下一个目录。如果是,请检查下一个和下一个,等等,直到你用完了路径。
如果没有,你将迭代目录,并运行相同的逻辑:获取目录,检查是否与第一个文件夹匹配等。
所以有点伪代码看起来像:
string directoryPath = "\MVVM\MyFirstTest2016\MyFirstTest\bin\Debug\MyFirstTest.exe"
string[] splitPath = directoryPath.split("\")
check("c:\")
public void check(string directory)
string[] directories = Directory.GetDirectories(@directory, "*")
if(checkDirectories(directories, splitPath))
// Success!
else
for(string subDirectory : directories)
string newDirectory = Path.combine(directory, subDirectory)
check(newDirectory)
public boolean checkDirectories(string[] directories, string[] splitPath)
// Horrible, but just for example - finding the file at the end
if(splitPath.size == 1)
// Get file list in current directory and check the last part of splitPath
if(directories.contains(splitPath[0])
// Recursively call checkDirectories with the sub directories of this folder, an splitPath missing the first item. This can be done using Array.Copy(splitPath, 1, newArray, 0)
显然,这远不是可以运行的,但它应该给你基本的想法。我之前链接的另一个问题也有一个接受的答案,这将有助于更多。
答案 2 :(得分:0)
您可以遍历所有目录并检查子目录是否可用。
正常Directory.EnumerateDirectories
可能会抛出UnauthorizedAccessException
,从而停止查找目录的过程。
所以你可以编写自己的EnumerateDirectories,如下所示。
提供的示例将返回找到的文件夹。
void Main()
{
string path = @"temp\A\B";
var parts = path.Split(new [] { Path.DirectorySeparatorChar });
var rootPath = "c:\\";
foreach(var result in DirectoryEx.EnumerateDirectories(rootPath, parts.First()))
{
var checkPath = Path.Combine(result, String.Join(""+Path.DirectorySeparatorChar, parts.Skip(1).ToArray()));
if (Directory.Exists(checkPath))
Console.WriteLine("Found : " + checkPath);
}
}
public class DirectoryEx
{
public static IEnumerable<string> EnumerateDirectories(string dir, string name)
{
IEnumerable<string> dirs;
// yield return may not be used in try with catch.
try { dirs = Directory.GetDirectories(dir); }
catch(UnauthorizedAccessException) { yield break; }
foreach (var subdir in dirs)
{
if(Path.GetFileName(subdir).Equals(name, StringComparison.OrdinalIgnoreCase))
yield return subdir;
foreach(var heir in EnumerateDirectories(subdir, name))
yield return heir;
}
}
}
在我的案例结果中:
Found : c:\dev\temp\A\B
Found : c:\Temp\A\B