创建目录我们使用System.IO(要在程序开头加上using System.IO)命名空间下的Directory:
Directory.CreateDirectory("D:\\PTC\\newfiles");
运行这句话会在Windows电脑上D盘创建一个PTC文件,并在PTC文件中创建一个newfiles文件,如果文件已经存在就不会创建。这里面呢由于反斜杠 \ 是一个转义字符,所以在使用路径时需要写双反斜杠 \ 来表示一个物理反斜杠。
道理和用法并不难,但是实际运用可能还会有一些问题。比如:
为了使这段代码工作,我们需要确保运行代码的程序或用户具有在指定位置创建目录的足够权限。如果没有必要的权限,可能会抛出一个 UnauthorizedAccessException 异常。此外,如果路径字符串中指定的驱动器不存在或无法访问,可能会抛出 DriveNotFoundException 或 IOException 异常。
下面我们依据Windows窗口应用进行实例:
private void btnCreate_Click(object sender, EventArgs e)
{
string path = "D:\\PTC\\newfiles";
try
{
// 检查目录是否已经存在
if (!Directory.Exists(path))
{
// 创建目录
Directory.CreateDirectory(path);
MessageBox.Show("目录创建成功!", "操作成功", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show("目录已存在。", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
catch (UnauthorizedAccessException)
{
MessageBox.Show("没有权限创建目录,请以管理员身份运行。", "权限错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (IOException)
{
MessageBox.Show("创建目录时出现输入/输出错误。", "IO错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (Exception ex) // 捕捉其他所有异常
{
MessageBox.Show($"发生错误: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
这个是我们来指定一个路径,比如我们要获取IDE里面的文件目录:
使用如下命令:
string[] files = Directory.GetFiles("D:\\IDE");
这里我们调用 System.IO 命名空间中的 Directory.GetFiles 方法来检索D盘下IDE文件夹中所有文件的路径。这些路径被存储在一个字符串数组 files 中
然后遍历files,选定一个文本框或者其他框体进行输出展示,在这之前我们也可以先清空一下要输出的文本框:
this.txtContent.Clear();
foreach (string item in files)
{
this.txtContent.Text += item + "\r\n";
}
它将遍历 files 数组中的每个元素。每次循环迭代时,item 变量会被赋值为数组中的下一个文件路径。
this.txtContent 是当前窗体中的一个文本框控件(例如,RichTextBox、TextBox等)。Clear 方法被调用来清除文本框中的现有内容。
得到结果:
这里我们注意,显示的只是IDE中的文件而不是文件夹
同样的,我们需要注意,这段代码没有进行异常处理,所以如果 D:\IDE 路径不存在或应用程序没有足够的权限访问此目录,执行时可能会抛出异常。在实际的应用程序中,通常需要包含异常处理来增强代码的健壮性。
以下是完善后的程序(常用于实际项目中):
try
{
// 获取D盘IDE文件夹下所有文件的路径
string[] files = Directory.GetFiles("D:\\IDE");
// 清除文本框中的现有内容
this.txtContent.Clear();
// 使用StringBuilder来提高字符串拼接的效率
StringBuilder sb = new StringBuilder();
// 遍历所有文件路径
foreach (string file in files)
{
// 将每个文件的路径追加到StringBuilder对象中,每个路径后面追加换行符
sb.AppendLine(file);
}
// 将StringBuilder中的内容转换为字符串,然后一次性设置到文本框中
this.txtContent.Text = sb.ToString();
}
catch (DirectoryNotFoundException)
{
MessageBox.Show("指定的目录不存在,请检查路径。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (UnauthorizedAccessException)
{
MessageBox.Show("没有足够的权限访问目录,请以管理员身份运行或检查目录权限。", "权限错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (Exception ex)
{
// 捕获其他所有可能的异常,并将异常信息显示给用户
MessageBox.Show($"发生错误: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
这里加入了 try…catch 块,以捕获和处理可能发生的异常。
使用 StringBuilder 类来代替字符串拼接,这在处理大量字符串时更为高效,因为它在内存中更高效地管理字符串的修改。
添加了特定类型的异常处理,如 DirectoryNotFoundException 和 UnauthorizedAccessException,为用户提供更具体的错误信息。
任何其他类型的异常都会被最后一个 catch 语句捕获,错误信息会通过一个消息框显示给用户。
注意在代码中使用了 MessageBox.Show 方法来显示错误信息对话框,这要求项目引用了 System.Windows.Forms 命名空间,并且是在一个Windows窗体应用程序的上下文中运行。如果是一个控制台应用程序或其他类型的应用程序,则需要用其他方式向用户报告错误。
private void btnShowSubDir_Click(object sender, EventArgs e)
{
string[] dirs = Directory.GetDirectories("D:\\IDE");
this.txtContent.Clear();
foreach (string item in dirs)
{
this.txtContent.Text += item + "\r\n";
}
}
一定要注意,获取文件(具体的文件,比如.txt ; .jpg)和子目录(文件夹)是不一样的。
删除指定目录下的所有子目录和文件
private void btnDelAllFiles_Click(object sender, EventArgs e)
{
// Directory.Delete("C:\\Myfiles");//要求目录必须为空
//使用DirectoryInfo对象,可以删除不为空的目录
DirectoryInfo dir = new DirectoryInfo("C:\\Myfiles");
dir.Delete(true);
}
这里面有 System.IO.Directory.Delete ,这个方法可以删除指定的目录。然而,它有一个限制:默认情况下,目录必须是空的才能被删除。也就是说,如果目录中有任何文件或子目录,就会抛出一个异常。
而调用 DirectoryInfo 对象的 Delete 方法时,传递参数 true 表示你想要删除目录及其所有内容,包括所有子目录和文件。如果传递参数 false 或者不传递参数,这个方法将只会删除空目录,如果目录中有内容,则会抛出异常。
这个是我们训练时用的程序,同时地,给出实际应用时的程序:
private void btnDelAllFiles_Click(object sender, EventArgs e)
{
try
{
DirectoryInfo dir = new DirectoryInfo("C:\\Myfiles");
dir.Delete(true);
MessageBox.Show("目录已删除。");
}
catch (DirectoryNotFoundException)
{
MessageBox.Show("目录未找到。");
}
catch (UnauthorizedAccessException)
{
MessageBox.Show("没有足够的权限删除目录。");
}
catch (Exception ex)
{
MessageBox.Show($"发生错误: {ex.Message}");
}
}