使用文件(C# 和 .NET Framework)






4.64/5 (19投票s)
本文解释了 .NET Framework 中 File 类的基本知识,这些知识在处理文件系统时非常有用,用于创建、编辑、修改或删除文件或目录。
引言
本文试图解释系统中文件和目录的基础知识。开发人员如何开发与文件系统交互的软件,创建新文件,修改或编辑现有文件和/或将它们移动到文件系统中的新位置或完全删除它们。
本文的代码解释了 .NET Framework 和 C# 以及 File
或 Directory
类的完全初学者。它将帮助他们理解这些类是什么,以及他们可以用它们做什么。
背景
处理文件(尤其是图像)被认为是艰巨的工作,开发人员在开发项目时会遇到困难。但 .NET Framework 拥有非常酷的 API,可以帮助您非常快速地完成所有这些功能。
如果您使用 .NET Framework,甚至不需要在编写代码以创建新文件时换行。只需提供文件名和位置即可!
System.IO
在 .NET Framework 中,为每个进程和功能定义了类。在定义输入和输出类时,它们将它们合并到一个命名空间中,即 System.IO
命名空间。它包含所有特定类型的功能和方法,您可以使用它们来处理输入和输出流。处理目录和文件是此命名空间的一部分。因为文件和目录是在您计算机的硬盘驱动器上创建的,并且从中提取或写入数据是输入和输出的一部分,这就是原因。File
和 Directory
类是此命名空间的一部分。
由于我们只处理文件和目录,所以我们只讨论 System.IO 本身,而不是它的任何派生,例如内存等。
http://msdn.microsoft.com/en-us/library/System.IO(v=vs.110).aspx
上述链接包含有关命名空间及其可以执行的方法的完整详细说明和信息。
目录
目录在 Windows 中也称为文件夹(可能还有其他操作系统,因为我只使用过 Windows,所以我不会费心让你们感到困惑)。在操作系统中,有许多文件夹用于将相似数据分组在一起,以便将来使用文件夹名称查找它们可能很容易。
我们可以使用 .NET Framework 的 Directory 类在文件系统内部处理这些目录。您可以使用 Directory 对象并将其指向某个位置,以便您可以处理它们。Directory 和 File 方法没有任何构造函数,所以不要费心向它传递值,或使用 new
关键字。
由于目录和文件在功能上相似,文件是一个有点庞大的章节,所以我将解释它,Directory 类具有相同的 Create、Move 和 Delete 方法,但只是在方法后面加上 Directory 以告诉开发人员此方法必须有一个目录才能操作。
http://msdn.microsoft.com/en-us/library/system.io.directory(v=vs.110).aspx
上述链接是 .NET Framework 中的 Directory 类,您可以在 MSDN 文档中轻松学习它。
文件
这是本教程文章将涵盖的主要主题。.NET Framework 开发人员做了大量工作,试图为开发人员提供一个易于编写的 API,以便他们可以少写多做。
文件实际上只是硬盘上的二进制数据,我们的操作系统使用一些算法和编码,通过文件分配表(FAT;你一定在格式化驱动器时听说过这个名称。是的,它是相同的术语,这是文件系统版本和操作系统为系统中文件分配创建的表的版本)中的扩展名将其读取为文件,然后相对地在用户屏幕上显示它们。
public static class File
这是 File 类的基本声明,您可以从声明中看出不能在它上面使用 new 关键字,因为该类是静态的。
http://msdn.microsoft.com/en-us/library/system.io.file(v=vs.110).aspx
创建新文件
与所有情况一样,第一个过程是创建。文件创建过程在 C# 中非常简单,我们只需传递一个包含(新 - 待创建)文件位置的字符串。然后 .NET Framework 为我们处理其余的事情。
File.Create("<location>").Close();
您可以将位置替换为您要存储文件的位置。它必须是字符串。我在此函数上调用的 close 方法需要关闭流并允许其他线程和进程在需要时使用文件。否则将向用户显示“文件正在被另一个进程使用”错误。为了尽量减少这种情况,至少您自己应该关闭文件流并将其释放。
但是,Close 函数不是必需的类,您可以继续处理和执行,甚至不需要调用该函数,程序也不会抱怨。
写入数据
文件通常以二进制形式创建,它们包含存储在硬盘上的二进制数据块,然后通过扩展名和方案转换为不同的文件,但深入来看,它们都只是二进制。因此,您可以将数据写入文件,该文件将进一步转换为二进制。这只是我们,试图写入并取回花哨的数据。
.NET framework 提供了许多函数来写入数据,具体取决于您拥有的数据类型。您可以写入字符串数据、字节、数组等。所有这些函数都使用相同的名称调用,但参数不同,因为它们使用不同的数据类型传递。
File.WriteAllBytes(string fileLocation, byte[] bytes);
..上面的代码会将所有字节数据写入文件。
在 File 和 Directory 类的所有代码和方法中,文件或目录的位置优先,然后传递参数值以进行操作。如果有一个函数的位置在后面,那对我来说将是新的。
您甚至可以将字符串数据或数组传递给方法。数组用于写入行。这样,包含行数据的数据将传递给新方法以行形式写入数据。例如,
// create new array string[] lines = {"First", "Second", "Third"}; // loop for each of the line foreach (string line in lines) { // write it File.WriteAllText(fileLocation, line); }
..上面的方法用于写入数组中的每个字符串。但是,如前所述,数组有一个默认方法。那就是
File.WriteAllLines(fileLocation, lines); // lines is array
..这将写入变量中字符串的每次出现。当有很多行并且您想高效地编码时非常方便。让 .NET framework 为您处理代码,只需传递数组和位置。
读取数据
从文件读取数据就像写入数据一样简单。相同的单行代码,相同的名称,但只是 Read 而不是 Write。
.NET Framework 开发人员非常关注开发人员的需求,并开发出了一个出色的工具。就像您将字符串、数组和字节传递给文件一样,您将使用相同的方法从文件中访问和提取字节、字符串和数组。例如以下代码,
File.ReadAllText(fileLocation); // returns string File.ReadAllLines(fileLocation); // returns string[] File.ReadAllBytes(fileLocation); // returns byte[]
..相同的方法和相同的返回值。然后您可以处理返回给您的数据并处理数据或任何任务。
如果一个文件没有存储字符串信息,您仍然可以获取字节信息,并通过猜测文件的方案,您可以轻松地以您想要的形式获取数据。
移动文件
这是 File 使用较少而 Directory 使用较多的模块。因为在此模块中,您将文件从一个位置移动到另一个位置。
在 File 中有一个名为 Move 的方法,它获取两个目录的位置,并将第一个位置的文件传递到第二个参数的位置。您可能不会很快理解,但请看
File.Move(fileLocation, newLocation);
上面的代码会将位于 fileLocation 的文件移动到 newLocation 的新位置。您必须首先检查那里是否存在任何文件。这不是必需的方式,但这样做是好的方式。这样在代码执行中就不会引发任何异常。
移动文件,如前所述,本身不是 File 的工作,它是目录的工作,您只需更改该文件的目录并将其移动到驱动器上的新位置。
删除文件
删除文件是其生命周期的最后阶段。您可以调用一个简单且单行代码来删除文件,.NET Framework 将从系统中删除该文件。
File.Delete(fileLocation);
..只需文件的位置。首先检查文件中文件的存在性以防止引发任何错误是一个好方法。
返回目录...
...如前所述,Directory 反映了 File 类的方法和函数,您可以使用这些方法,只是函数名称略有不同。
Directory.CreateDirectory(dirLocation); // creates directory Directory.Delete(dirLocation); // deletes directory
..所有函数都相似。但它们只有一个不同之处。那就是它们包含更多文件和目录,而文件只能包含其数据。为此,开发人员添加了一些更多函数来处理目录的此属性。
目录中的目录
每个目录中可以有更多或多个目录,您可以从当前引用的目录中获取这些目录。
Directory.EnumerateDirectories(currentDirectory);
这会返回一个枚举列表,您可以将其转换为 List<string>
并开始使用或显示名称等。例如,此代码
List<string> dirs = new List<string>(Directory.EnumerateDirectories(dirPath));
它以字符串数据类型列表的形式获取其中存在的目录名称。每个目录都具有此属性,并且可以在其上调用此方法。使您能够遍历用户系统上的每个文件夹。
目录中的文件
在目录中,一个目录中可以有多个文件,为了找到它们,框架有一个不同的函数准备好了。
Directory.EnumerateFiles(currentDirectory); // returns the files
您也可以调用相同的函数来获取字符串中的名称,这已用于上面块的转换。
一些一般提示
在使用文件和目录时,您需要确保以下几点:
- 参数不为
null
。 - 文件名准确并添加了扩展名。
- 在读取或写入内容时,文件存在。
这些单个 if else
块实际上不是框架或代码本身所必需的,但对于最大程度地减少错误非常有用。例如,您可以检查文件是否存在,然后运行代码创建它并在以后处理它,而不是仅仅得到一个烦人的异常和软件执行的停止。
如上文所述,我提到了流的关闭和其他一些预防措施。这些只是为了确保应用程序平稳运行,并减少出现任何异常的机会。我知道,开发人员讨厌不必要的异常。
附带的应用程序..
..包含基本源代码以及已构建和测试的软件。您可以使用它来处理系统的文件系统。该软件上使用的是相同的代码,所以不用担心,您在这里阅读或学到的内容都在那里,没有包含更多教程。
本文中教授的 System.IO 的量与应用程序中的相同。
关注点
System.IO 还支持来自内存的输入和输出流,因此您甚至可以直接将数据存储在内存中并从内存中提取数据。
历史
首发。