0

基本上我想复制一个文件夹中的所有内容,不包括一个文件夹,这恰好是为我的程序存储日志的地方。(我知道我可以将日志存储在其他地方,但我有我的理由)。到目前为止,我有:

private void btnCopyFiles_Click(object sender, EventArgs e)
    {
        try
        {
            //Copy all the files
            foreach (string newPath in Directory.GetFiles(@"\\xxx\yyy", "*.*",
                            SearchOption.AllDirectories)
                            .Where(p => p != Logging.fullLoggingPath))
                File.Copy(newPath, newPath.Replace(@"\\xxx\yyy", @"C:\bbb"));
            using (StreamWriter w = File.AppendText(Logging.fullLoggingPath))
            {
                Logging.Log("All necessary files copied to C:\\bbb", w);
            }
        }
        catch
        {
            using (StreamWriter w = File.AppendText(Logging.fullLoggingPath))
            {
                Logging.Log("Error copying files, make sure you have permissions to access the drive and write to the folder.", w);
            }
        }
    }

如何修改它以排除其中的一个特定文件夹\\xxx\yyy

4

3 回答 3

4
    foreach (string newPath in Directory.GetFiles(@"\\xxx\yyy", "*.*",
                    SearchOption.AllDirectories)
                    .Where(p=>p!=Logging.fullLoggingPath))
                File.Copy(newPath, newPath.Replace(@"\\xxx\yyy", @"C:\bbb"));
    using (StreamWriter w = File.AppendText(Logging.fullLoggingPath))
    {
         Logging.Log("All necessary files copied to C:\\bbb", w);
    }
于 2013-09-19T21:17:30.547 回答
4

在您的循环中,只需添加一个条件以排除该目录

If (Path.GetDirectory(newPath) == PathToExclude)
    Continue;
于 2013-09-19T21:18:51.130 回答
3

检查文件夹的名称并跳过它

foreach (string newPath in Directory.GetFiles(@"\\xxx\yyy", "*.*", SearchOption.AllDirectories))
{
    String currentFolder = "";
    int lastSlash = newPath.LastIndexOf("\\");
    int secondLastSlash = newPath.Substring(0, newPath.Length - (newPath.Length - lastSlash)).LastIndexOf("\\")+1;
        currentFolder = newPath.Substring(secondLastSlash,(lastSlash-secondLastSlash))

    If(!currentFolder.Equals(NameOfFolderNotToInclude))
        File.Copy(newPath, newPath.Replace(@"\\xxx\yyy", @"C:\bbb"), true);
}
        using (StreamWriter w = File.AppendText(Logging.fullLoggingPath))
        {
            Logging.Log("All necessary files copied to C:\\bbb", w);
        }

lastSlash 变量是字符串中最后一个 \ 的位置,表示后面的文本是实际文件。然后,我们创建一个子字符串,将字符串中最后一个 \ 之后的所有内容删除到文件路径。这为我们提供了通往该文件夹的路径。然后,我们利用子字符串查找下一个 \,以便我们可以仅提取特定文件夹。

因此,在诸如 C:\users\someone\desktop\test.txt 这样的路径中,lastSlash 将指示 test.txt 之前的 \ 使用它我们创建一个等于 C:\users\someone\desktop 的子字符串,然后我们使用相同的在这个路径中找到最后一个\的方法我们将它们组合在一起以提取桌面文件夹。

您可以使用 Jim Mischel 的建议,因为它更加用户友好和可读。使用下面的示例

foreach (string newPath in Directory.GetFiles(@"\\xxx\yyy", "*.*", SearchOption.AllDirectories))
{
    if(Path.GetDirectory(newPath) != PathToExclude)
        File.Copy(newPath, newPath.Replace(@"\\xxx\yyy", @"C:\bbb"), true);
}
        using (StreamWriter w = File.AppendText(Logging.fullLoggingPath))
        {
            Logging.Log("All necessary files copied to C:\\bbb", w);
        }
于 2013-09-19T21:16:36.133 回答