C# 将目录移动到当前目录C中#

C# 将目录移动到当前目录C中#,c#,C#,我想做一些简单的事情。获取文件夹A的内容,并将文件和文件夹移动到文件夹A内的文件夹中。然后将文件夹A设为隐藏文件夹 下面的代码正在获取未找到hiddenTarget的异常 Directory.Create(hiddenTarget) is not helping 必须有一个简单的方法来做到这一点。目前我正在尝试创建一个临时目录。将当前目录中的所有文件放入其中。然后将临时目录移动到当前目录。然后隐藏当前目录 下面是正在发布的代码 string tempFolder = Path.Combine(

我想做一些简单的事情。获取文件夹A的内容,并将文件和文件夹移动到文件夹A内的文件夹中。然后将文件夹A设为隐藏文件夹

下面的代码正在获取未找到hiddenTarget的异常

Directory.Create(hiddenTarget) is not helping
必须有一个简单的方法来做到这一点。目前我正在尝试创建一个临时目录。将当前目录中的所有文件放入其中。然后将临时目录移动到当前目录。然后隐藏当前目录

下面是正在发布的代码

string tempFolder = Path.Combine(Environment.ExpandEnvironmentVariables("%TEMP%"), "tempTarget");
//Directory.CreateDirectory(tempFolder);

Directory.Move(currentTarget, tempFolder);

string hiddenTarget = Path.Combine(currentTarget, @".bak");
//Directory.CreateDirectory(hiddenTarget);

Directory.Move(tempFolder, hiddenTarget);

DirectoryInfo di = new DirectoryInfo(currentTarget);
di.Attributes = FileAttributes.Directory | FileAttributes.Hidden;

因此,这里有两个问题:首先,隐藏目标不能以“.”开头,因为正如注释中指出的,在NTFS中是非法的

正如您所看到的,文件资源管理器不喜欢这种语法

此处指出的是相关信息的链接:


您的下一个问题是移动正在破坏原始目录结构。因此,您的步骤需要如下所示:

1) 移动到临时目录以避免两个进程(文件系统和您的进程)争夺访问权限时出现任何问题

2) 由于步骤#1中的Directory.Move销毁了原始源目录。重新创建已销毁的源文件夹

3) 然后移动到所需的嵌套文件夹中。此移动操作将自动创建所需的子目录。第#2步是必需的,因为无论出于何种原因,我仍在查看目录。如果源目录不存在,Move无法自动创建结构

        string currentTarget = @"C:\A";
        string hiddenTarget = @"C:\A\Subfolder";

        string tempTarget = @"C:\Temp";

        Directory.Move(currentTarget, tempTarget);
        Directory.CreateDirectory(currentTarget);
        Directory.Move(tempTarget, hiddenTarget);

        DirectoryInfo di = new DirectoryInfo(currentTarget);
        di.Attributes = FileAttributes.Directory | FileAttributes.Hidden;

更新

从工程的角度来看,如果您真的关心移动的数据,那么您真的应该执行拷贝。它可能较慢,但有助于防止数据发生任何可怕的事情。在创建这些目录之前,应该先检查它们是否存在。本例中的异常处理也是最低限度的。我真正想强调的是小心处理移动的数据

    static void Main(string[] args)
    {
        string sourceDir = @"C:\Src";
        string tempDir = @"C:\Temp";
        string destDir = Path.Combine(sourceDir, "Dest");

        // Could optionally check to verify that the temp directory already exists here and destroy it if it does.
        // Alternatively, pick a really unique name for the temp directory by using a GUID, Thread Id or something of that nature.
        // That way you can be sure it does not already exist.

        // Copy to temp, then destroy source files.
        CopyDirectory(sourceDir, tempDir);
        Directory.Delete(sourceDir, true);

        // Copy to dest
        CopyDirectory(tempDir, destDir);

        // Hide the source directory.
        DirectoryInfo di = new DirectoryInfo(sourceDir);
        di.Attributes = FileAttributes.Directory | FileAttributes.Hidden;

        // Clean up the temp directory that way copies of the files aren't sitting around.
        // NOTE: Be sure to do this last as if something goes wrong with the move the temp directory will still exist.
        Directory.Delete(tempDir, true);

    }

    /// <summary>
    /// Recursively copies all subdirectories.
    /// </summary>
    /// <param name="sourceDir">The source directory from which to copy.</param>
    /// <param name="destDir">The destination directory to copy content to.</param>
    static void CopyDirectory(string sourceDir, string destDir)
    {
        var sourceDirInfo = new DirectoryInfo(sourceDir);
        if (!sourceDirInfo.Exists)
        {
            throw new DirectoryNotFoundException($"Source directory does not exist or could not be found: '{sourceDir}'");
        }

        // If the destination directory doesn't exist, create it.
        if (!Directory.Exists(destDir))
        {
            Directory.CreateDirectory(destDir);
        }

        // Get the files in the directory and copy them to the new location.
        FileInfo[] files = sourceDirInfo.GetFiles();
        foreach (FileInfo file in files)
        {
            string tempPath = Path.Combine(destDir, file.Name);
            file.CopyTo(tempPath, false);
        }

        // Copy subdirectories
        DirectoryInfo[] subDirs = sourceDirInfo.GetDirectories();
        foreach (DirectoryInfo subdir in subDirs)
        {
            string tempPath = Path.Combine(destDir, subdir.Name);
            CopyDirectory(subdir.FullName, tempPath);
        }
    }
static void Main(字符串[]args)
{
字符串sourceDir=@“C:\Src”;
字符串tempDir=@“C:\Temp”;
字符串destDir=Path.Combine(sourceDir,“Dest”);
//可以选择检查以验证临时目录是否已经存在,如果已经存在,则将其销毁。
//或者,通过使用GUID、线程Id或类似的东西为临时目录选择一个真正唯一的名称。
//这样你就可以确定它并不存在。
//复制到临时文件,然后销毁源文件。
CopyDirectory(sourceDir、tempDir);
Directory.Delete(sourceDir,true);
//复制到dest
CopyDirectory(tempDir、destDir);
//隐藏源目录。
DirectoryInfo di=新的DirectoryInfo(sourceDir);
di.Attributes=FileAttributes.Directory | FileAttributes.Hidden;
//清理临时目录,这样文件的副本就不会被闲置。
//注意:确保最后执行此操作,就好像移动临时目录时出错一样。
Delete(tempDir,true);
}
/// 
///递归复制所有子目录。
/// 
///要从中复制的源目录。
///要将内容复制到的目标目录。
静态void CopyDirectory(字符串sourceDir、字符串destDir)
{
var sourceDirInfo=新目录信息(sourceDir);
如果(!sourceDirInfo.Exists)
{
抛出新的DirectoryNotFoundException($”源目录不存在或找不到:“{sourceDir}”);
}
//如果目标目录不存在,请创建它。
如果(!Directory.Exists(destDir))
{
CreateDirectory(destDir);
}
//获取目录中的文件并将其复制到新位置。
FileInfo[]files=sourceDirInfo.GetFiles();
foreach(文件中的文件信息文件)
{
字符串tempPath=Path.Combine(destDir,file.Name);
CopyTo文件(tempPath,false);
}
//复制子目录
DirectoryInfo[]subDirs=sourceDirInfo.GetDirectories();
foreach(目录信息子目录中的目录信息子目录)
{
字符串tempPath=Path.Combine(destDir,subdir.Name);
CopyDirectory(subdir.FullName,tempPath);
}
}
这里还有一些关于上述内容的链接


所以这里有两个问题,第一个问题是隐藏目标不能以“.”开头,因为正如注释中指出的,在NTFS中是非法的

正如您所看到的,文件资源管理器不喜欢这种语法

此处指出的是相关信息的链接:


您的下一个问题是移动正在破坏原始目录结构。因此,您的步骤需要如下所示:

1) 移动到临时目录以避免两个进程(文件系统和您的进程)争夺访问权限时出现任何问题

2) 由于步骤#1中的Directory.Move销毁了原始源目录。重新创建已销毁的源文件夹

3) 然后移动到所需的嵌套文件夹中。此移动操作将自动创建所需的子目录。第#2步是必需的,因为无论出于何种原因,我仍在查看目录。如果源目录不存在,Move无法自动创建结构

        string currentTarget = @"C:\A";
        string hiddenTarget = @"C:\A\Subfolder";

        string tempTarget = @"C:\Temp";

        Directory.Move(currentTarget, tempTarget);
        Directory.CreateDirectory(currentTarget);
        Directory.Move(tempTarget, hiddenTarget);

        DirectoryInfo di = new DirectoryInfo(currentTarget);
        di.Attributes = FileAttributes.Directory | FileAttributes.Hidden;

更新

从工程的角度来看,如果您真的关心移动的数据,那么您真的应该执行拷贝。它可能较慢,但有助于防止数据发生任何可怕的事情。在创建这些目录之前,应该先检查它们是否存在。本例中的异常处理也是最低限度的。我真正想强调的是小心处理移动的数据

    static void Main(string[] args)
    {
        string sourceDir = @"C:\Src";
        string tempDir = @"C:\Temp";
        string destDir = Path.Combine(sourceDir, "Dest");

        // Could optionally check to verify that the temp directory already exists here and destroy it if it does.
        // Alternatively, pick a really unique name for the temp directory by using a GUID, Thread Id or something of that nature.
        // That way you can be sure it does not already exist.

        // Copy to temp, then destroy source files.
        CopyDirectory(sourceDir, tempDir);
        Directory.Delete(sourceDir, true);

        // Copy to dest
        CopyDirectory(tempDir, destDir);

        // Hide the source directory.
        DirectoryInfo di = new DirectoryInfo(sourceDir);
        di.Attributes = FileAttributes.Directory | FileAttributes.Hidden;

        // Clean up the temp directory that way copies of the files aren't sitting around.
        // NOTE: Be sure to do this last as if something goes wrong with the move the temp directory will still exist.
        Directory.Delete(tempDir, true);

    }

    /// <summary>
    /// Recursively copies all subdirectories.
    /// </summary>
    /// <param name="sourceDir">The source directory from which to copy.</param>
    /// <param name="destDir">The destination directory to copy content to.</param>
    static void CopyDirectory(string sourceDir, string destDir)
    {
        var sourceDirInfo = new DirectoryInfo(sourceDir);
        if (!sourceDirInfo.Exists)
        {
            throw new DirectoryNotFoundException($"Source directory does not exist or could not be found: '{sourceDir}'");
        }

        // If the destination directory doesn't exist, create it.
        if (!Directory.Exists(destDir))
        {
            Directory.CreateDirectory(destDir);
        }

        // Get the files in the directory and copy them to the new location.
        FileInfo[] files = sourceDirInfo.GetFiles();
        foreach (FileInfo file in files)
        {
            string tempPath = Path.Combine(destDir, file.Name);
            file.CopyTo(tempPath, false);
        }

        // Copy subdirectories
        DirectoryInfo[] subDirs = sourceDirInfo.GetDirectories();
        foreach (DirectoryInfo subdir in subDirs)
        {
            string tempPath = Path.Combine(destDir, subdir.Name);
            CopyDirectory(subdir.FullName, tempPath);
        }
    }
static void Ma