C# 来自目录树数组的路径

C# 来自目录树数组的路径,c#,directory,C#,Directory,我正在使用Directory.GetFiles查找要复制的文件。我需要找到文件的路径,以便我可以使用copy,但我不知道如何找到路径。 它可以很好地遍历文件,但我无法复制或移动它们,因为我需要文件的源路径 这就是我所拥有的: string[]files=Directory.GetFiles(sourcePath,“*.*”,SearchOption.AllDirectories); System.Console.WriteLine(“找到文件”); //显示所有文件。 foreach(文件中的字

我正在使用
Directory.GetFiles
查找要复制的文件。我需要找到文件的路径,以便我可以使用copy,但我不知道如何找到路径。 它可以很好地遍历文件,但我无法复制或移动它们,因为我需要文件的源路径

这就是我所拥有的:

string[]files=Directory.GetFiles(sourcePath,“*.*”,SearchOption.AllDirectories);
System.Console.WriteLine(“找到文件”);
//显示所有文件。
foreach(文件中的字符串文件)
{
字符串扩展名=Path.GetExtension(文件);
字符串thenameofdoom=Path.GetFileNameWithoutExtension(文件);
字符串文件名=Path.GetFileName(文件);
布尔b=假;
字符串newlocation=(@“\\TEST12CVG\Public\Posts\Temporaryjunk\”;
如果(扩展名=“.pst”|124;
扩展=“.tec”|
扩展名=“.pas”|
扩展名=“.snc”||
扩展名=“.cst”)
{
b=正确;
}
如果(thenameofdoom==“Plasma”| |
thenameofdoom==“氧气”|
thenameofdoom==“等离子体”|
thenameofdoom==“氧气”|
thenameofdoom==“氧气燃料”
thenameofdoom==“氧气燃料”)
{
b=假;
}
如果(b==true)
{
File.Copy(文件,newlocation+thenameofdoom);
System.Console.WriteLine(“成功:+filename”);
b=假;
}
}

<代码> >代码>路径.GETFultPosith Work,但也考虑使用<代码> FielFiels<代码>,因为它有许多文件帮助方法。

我会使用类似的方法(可以使用更多的错误处理(尝试捕获…),但这是一个好的开始

编辑我注意到您正在筛选扩展,但需要它们,代码更新允许这样做

class BackupOptions
{
  public IEnumerable<string> ExtensionsToAllow { get; set; }
  public IEnumerable<string> ExtensionsToIgnore { get; set; }
  public IEnumerable<string> NamesToIgnore { get; set; }
  public bool CaseInsensitive { get; set; }

  public BackupOptions()
  {
    ExtensionsToAllow = new string[] { };
    ExtensionsToIgnore = new string[] { };
    NamesToIgnore = new string[] { };
  }
}

static void Backup(string sourcePath, string destinationPath, BackupOptions options = null)
{

  if (options == null)
    optionns = new BackupOptions();

  string[] files = Directory.GetFiles(sourcePath, ".", SearchOption.AllDirectories);
  StringComparison comp = options.CaseInsensitive ? StringComparison.CurrentCultureIgnoreCase : StringComparison.CurrentCulture;

  foreach (var file in files)
  {
    FileInfo info = new FileInfo(file);

    if (options.ExtensionsToAllow.Count() > 0 &&
      !options.ExtensionsToAllow.Any(allow => info.Extension.Equals(allow, comp)))
      continue;

    if (options.ExtensionsToIgnore.Any(ignore => info.Extension.Equals(ignore, comp)))
        continue;

    if (options.NamesToIgnore.Any(ignore => info.Name.Equals(ignore, comp)))
      continue;

    try
    {
      File.Copy(info.FullName, destinationPath + "\\" + info.Name);
    }
    catch (Exception ex)
    {
      // report/handle error
    }
  }
}

它有更多,但我把必要的东西放上去了。我需要它来完成我的工作,而且我需要的是更快,而不是更晚。你是说
Path.GetDirectoryName(filename)
?我需要完整的路径,而不仅仅是文件所在的文件夹。我只使用过C#2天,昨天是我第一次使用它。但考虑到这个事实,我认为我做得相当好。path.GetFullPath方法?文件在一台服务器上,它们将被放在另一台服务器上,我认为eric告诉我的方法是可行的(除了权限之外,它没有任何例外),它有一个权限问题,我必须解决。没有任何东西真正需要错误处理。@shred1894 Path.GetDirectoryName(文件)并不比我提供的代码好。使用UNC路径,即
\\servername\…
对代码来说并不重要,这段代码也同样有效。在您选择的任何可行的解决方案中,您的进程都需要适当的读写权限,即使是本地或远程文件。@shred1894请注意,我使用的是
FileInfo因为它有很多很好的帮助方法,可以很容易地获取路径、名称和扩展名。我不是在谈论getdirectoryfilename,我是在谈论getfullpath,我为它设置了一些测试,它按照我所需要的方式工作,所以感谢所有的帮助。现在我需要让它创建目录并将复制的文件放入其中,但是除了至少,它是有效的。
var options = new BackupOptions
{
  ExtensionsToAllow = new string[] { ".pst", ".tec", ".pas", ".snc", ".cst" },
  NamesToIgnore = new string[] { "Plasma", "Oxygas", "Oxyfuel" },
  CaseInsensitive = true
};

Backup("D:\\temp", "D:\\backup", options);