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