下面是一些常见的问题:
问题1:如何获取指定文件的基本信息;
解决方案:可以使用FileInfo类的相关属性:
FileInfo.Exists:获取指定文件是否存在;
FileInfo.Name,FileInfo.Extensioin:获取文件的名称和扩展名;
FileInfo.FullName:获取文件的全限定名称(完整路径);
FileInfo.Directory:获取文件所在目录,返回类型为DirectoryInfo;
FileInfo.DirectoryName:获取文件所在目录的路径(完整路径);
FileInfo.Length:获取文件的大小(字节数);
FileInfo.IsReadOnly:获取文件是否只读;
FileInfo.Attributes:获取或设置指定文件的属性,返回类型为FileAttributes枚举,可以是多个值的组合(见问题2);
FileInfo.CreationTime、FileInfo.LastAccessTime、FileInfo.LastWriteTime:分别用于获取文件的创建时间、访问时间、修改时间;
(更多内容还请参考MSDN)
问题2:如何获取和设置文件的属性,比如只读、存档、隐藏等;
解决方案:
使用FileInfo.Attributes属性可以获取和设置文件的属性,该属性类型为FileAttributes枚举,该枚举的每个值表示一种属性,FileAttributes枚举具有属性(Attribute)FlagsAttribute,所以该枚举的值可以进行组合,也就是一个文件可以同时拥有多个属性。下面看看具体的做法:
获取属性,比如判断一个文件是否是只读的:
设置属性,比如添加和移除一个文件的只读属性:
问题3:如何获取文件的版本信息(比如版本号,版权声明,公司名称等);
解决方案:
使用FileVersionInfo类,该类有大量的版本信息相关的属性。通过它的静态方法GetVersionInfo获得该类的一个实例,然后就可以访问指定文件的版本信息了,非常方便。如FileVersion表示文件版本号,LegalCopyright表示指定文件的版权声明,CompanyName表示指定文件的公司名称。(更多内容还请参考MSDN)
问题4:如何判断两个文件的内容是否相同(精确匹配);
解决方案:
使用System.security.Cryptography.HashAlgorithm类为每个文件生成一个哈希码,然后比较两个哈希码是否一致。
在比较文件内容的时候可以采用好几种方法。例如,检查文件的某一特定部分是否一致;如果愿意,你甚至可以逐字节读取文件,逐字节进行比较。这两种方法都是可以的,但在某些情况下,还是使用哈希码算法更为方便。
该算法为一个文件生成一个小的(通常约为20字节)二进制”指纹”(binary fingerprint)。从统计学角度看,不同的文件不可能生成相同的哈希码。事实上,即使是一个很小的改动(比如,修改了源文件中的一个bit),也会有50%的几率来改变哈希码中的每一个bit。因此,哈希码常常用于数据安全方面。
要生成一个哈希码,你必须首先创建一个HashAlgorithm对象,而这通常是调用HashAlgorithm.Create方法来完成的;然后调用HashAlgorithm.ComputeHash方法,它会返回一个存储哈希码的字节数组。代码如下:
问题5:如何获取指定目录的基本信息;
解决方案:可以使用DirectoryInfo类的相关属性和方法:
DirectoryInfo.Exists:获取指定目录是否存在;
DirectoryInfo.Name:获取目录的名称;
DirectoryInfo.FullName:获取目录的全限定名称(完整路径);
DirectoryInfo.Attributes:获取或设置指定目录的属性,返回类型为FileAttributes枚举,可以是多个值的组合;
DirectoryInfo.CreationTime、FileInfo.LastAccessTime、FileInfo.LastWriteTime:分别用于获取目录的创建时间、访问时间、修改时间;
DirectoryInfo.Parent:获取目录的上级目录,返回类型为DirectoryInfo;
DirectoryInfo.Root:获取目录的根目录,返回类型为DirectoryInfo;
问题6:如何获取指定目录包含的文件和子目录;
解决方案:
DirectoryInfo.GetFiles():获取目录中(不包含子目录)的文件,返回类型为FileInfo[],支持通配符查找;
DirectoryInfo.GetDirectories():获取目录(不包含子目录)的子目录,
返回类型为DirectoryInfo[],支持通配符查找;
DirectoryInfo. GetFileSystemInfos():获取指定目录下(不包含子目录)的文件和子目录,
返回类型为FileSystemInfo[],支持通配符查找;
示例:
DirectoryInfo DirectInfo = new DirectoryInfo(Server.MapPath("目的文件夹名"));
foreach (FileSystemInfo FileSysInfo in DirectInfo.GetFileSystemInfos())
{
string filename = FileSysInfo.FullName;
Response.Write("<script>alert('" + filename + "')</script>");
}
问题7:如何获得指定目录的大小;
解决方案:
检查目录内的所有文件,利用FileInfo.Length属性获取每个文件的大小,然后进行合计,然后使用递归算法处理所有的子目录的文件,参考下面代码:
问题8:如何使用通配符搜索指定目录内的所有文件;
解决方案:
使用DirectoryInfo.GetFiles方法的重载版本,它可以接受一个过滤表达式,返回FileInfo数组,另外它的参数还可以指定是否对子目录进行查找。如:
问题9:如何复制、移动、重命名、删除文件和目录;
解决方案:使用FileInfo和DirectoryInfo类。
下面是FileInfo类的相关方法:
FileInfo.CopyTo:将现有文件复制到新文件,其重载版本还允许覆盖已存在文件;
FileInfo.MoveTo:将指定文件移到新位置,并提供指定新文件名的选项,所以可以用来重命名文件(而不改变位置); FileInfo.Delete:永久删除文件,如果文件不存在,则不执行任何操作;
FileInfo.Replace:使用当前FileInfo对象对应文件的内容替换目标文件,而且指定另一个文件名作为被替换文件的备份,微软考虑实在周到。
下面是DirectoryInfo类的相关方法:
DirectoryInfo.Create:创建指定目录,如果指定路径中有多级目录不存在,该方法会一一创建;
DirectoryInfo.CreateSubdirectory:创建当前对象对应的目录的子目录;
DirectoryInfo.MoveTo:将目录(及其包含的内容)移动至一个新的目录,也可用来重命名目录;
DirectoryInfo.Delete:删除目录(如果它存在的话)。如果要删除一个包含子目录的目录,要使用它的重载版本,以指定递归删除。
注意到了没有?DirectoryInfo类少了一个CopyTo方法,不过我们可以通过递归来实现这个功能:
问题10:如何获得计算机的所有逻辑驱动器;
解决方案:使用DriveInfo类(需要.NET 2.0)
DriveInfo.GetDrives():获得计算机的所有逻辑驱动器,返回类型为DriveInfo[];
问题11:如何获取指定驱动器的信息;
解决方案:
DriveInfo.Name:获取驱动器的名称(如C:\);
DriveInfo.DriveType:获取驱动器的类型(如Fixed,CDRom,Removable,Network等);
DriveInfo.DriveFormat:获取驱动器的格式(如NTFS,FAT32,CDFS,UDF等);
DriveInfo.IsReady:获取驱动器是否已准备好,比如CD是否已放入CD驱动器,如果驱动器没有准备好,访问其信息会引发IOException类型异常;
DriveInfo.AvailableFreeSpace:获取驱动器的可用空间;
DriveInfo.TotalFreeSpace:获取驱动器总的可用空间,它与AvailableFreeSpace的不同在于AvailableFreeSpace会磁盘配额的设置;
DriveInfo.TotalSize:获取驱动器总的空间;
DriveInfo.RootDirectory:获得驱动器的根目录(DirectoryInfo类型);
至此,我们已经了解了文件和目录相关的一些基本操作。但还不清楚如何去读写文件的内容,下一篇中会详细了解这方面的操作工作目录: Environment.CurrentDirectory
系统目录: Environment.SystemDirectory
当前目录: Server.MapPath(".")
计算机名称: Environment.MachineName
系统版本号: Environment.OSVersion.ToString()
处理器个数: Environment.ProcessorCount
系统启动时间(h): Environment.TickCount/3600000
网络域名: Environment.UserDomainName
当前用户: Environment.UserName
占用内存(k): Environment.WorkingSet/1024
分区个数: Environment.GetLogicalDrives().Length
Desktop: Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
Programs: Environment.GetFolderPath(Environment.SpecialFolder.Programs)
Personal: Environment.GetFolderPath(Environment.SpecialFolder.Personal)
MyDocuments: Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
Favorites: Environment.GetFolderPath(Environment.SpecialFolder.Favorites)
Startup: Environment.GetFolderPath(Environment.SpecialFolder.Startup)
Recent: Environment.GetFolderPath(Environment.SpecialFolder.Recent)
SendTo: Environment.GetFolderPath(Environment.SpecialFolder.SendTo)
StartMenu: Environment.GetFolderPath(Environment.SpecialFolder.StartMenu)
MyMusic: Environment.GetFolderPath(Environment.SpecialFolder.MyMusic)
DesktopDirectory: Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory)
MyComputer: Environment.GetFolderPath(Environment.SpecialFolder.MyComputer)
Templates: Environment.GetFolderPath(Environment.SpecialFolder.Templates)