
类浏览
微软文档中说 Directory类提供了在目录和子目录中进行创建移动和列举 *** 作的静态方法 此外 你还可以访问和 *** 作各种各样的目录属性 例如创建或最后一次修改旁含时间以及Windows访问控制列表等
Directory类的一个重要方面是它的方法都是静态的 这意味着你可以直接调用它们而不用创建该类的一个实例 让我们从基本的方面开始Directory类之旅 包括创建 删除和移动目录
基本方法
Directory类提供了各种目录处理的静态方法 这些静态方法对所有方法都执行安全性检查 我们将会介绍其中的大部分方法 第一组磨段有目录处理的基本方法组成
·CreateDirectory 可以用来创建目录或子目录 同时 还可以通过创建属性建立目录安全性检查
·Delete 可以用来删除系统中指定的空目录 如果路径参数所指定的目录中包含文件或子目录 该方法将会抛出IOExceptin异常
·Exists 可以此方法检测一个指定的路径是否存在 路径参数可以指定相对或绝对路径信息 相对路径信息解释为相对当前工作目录
·Move 可用该方法移动文件或目录到一个新位置 它有两个参数 移动的文件或目录以及目的位置
列表A中的C# Windows控制台应用程序使用这些方法来创建 移动和删除目录 整个代码中还使用了Exists方法来检查某个目录是否存在 所有对Directory类中方法的调用都封装在try/catch语句块中 代码从位于C盘的test目录开始 使用Path类来检测包含目录名的字符串中是否有文件扩展名 如果包含文件扩展名那么判断该字符串为一个文件路径 而不是目录程序终止 否则如果目录不存在那么将会创建该目录 接下来重命名目录为techrepublic 最后删除该目录 (列表B包含了用VB NET实现的相同功能的代码)
目录和它们的内容
一旦目录创建 通常我们需要详细了解它的内容或检查该目录 Directory类使得通过各种方法和属性访问目录信息和它的内容变得十分简单 下面的列表中列出了这些方法
·GetCurrentDirectory 返回应用程序的当前工作目录
·GetDirectories 返回指定目录的所有子目录列表 并用字符串数组存储
·GetDirectoryRoot 对指定的路径返回磁盘信息 更目录信息或两者都有
·GetFiles 返回指定目录范围内的所有文件名 存储在字符串数组中
·GetFileSystemEntries 返回指定哪个目录范围内的文件名和目录 并存储在字符串数组中
·GetParent 以字符串运游笑值返回指定路径的父目录 包括绝对路径和相对路径
·GetLogicalDrives 以<盘符>:的形式返回字符串数组中计算机上的逻辑盘符
列表C中的c#代码演示了这些方法的使用方法 基本上 该示例显示了有关当前应用目录 所有子目录和文件 根目录和当前系统上的所有逻辑盘符的所有信息 列表D包含了用VB NET实现相同功能的代码
日期和时间戳
通常 知道目录何时创建以及最后一次访问或修改时间是非常有用的 Directory类提供了处理日期和时间戳的方法 如下所示
·GetCreationTime 获得目录创建的日期时间
·GetLastAccessTime 返回指定文件或目录最后一次访问的日期时间
·GetLastWriteTime 返回指定文件或目录最后一次写入的日期时间
·SetCreationTime 设置指定文件或目录的创建日期和时间
·SetLastAccessTime 设置指定文件或目录上次访问日期和时间
·SetLastWriteTime 设置上次写入目录的日期和时间
列表E中的C#代码列出了C盘中所有目录最后一次访问 修改和最初创建的日期和时间 并把每个目录的最后一次访问时间设置为当前日期和时间 列表F包含了VB NET实现的相同功能的代码
系统的其它方面
文件处理通常要访问目录并对其进行相关 *** 作 System IO命名空间的Directory类提供了创建和处理目录以及它的内容的所有功能 利用它我们确定文件何时被创建和最后一次访问时间等
而且 系统管理员工作的一个重要方面是通过目录访问控制对系统资源的访问 下周 我们将介绍如何通过Directory类处理目录安全性问题
列表A
using Systemusing System Collections Genericusing System Textusing System IOnamespace TRDirectory {class Program {static void Main(string[] args) {string testPath = c:test if (Path HasExtension(testPath)) {Console WriteLine( This is a file path not a directory )} else {if (Directory Exists(testPath)) {Console WriteLine( This directory already exists )} else {try {Directory CreateDirectory(testPath)} catch (IOException ex) {Console WriteLine( Error creating directory testPath ex Message ToString())} }if (Directory Exists(testPath)) {try {Directory Move(testPath c:techrepublic )} catch (IOException ex) {Console WriteLine( Error moving directory testPath ex Message ToString())} }if (Directory Exists( c:techrepublic )) {try {Directory Delete( c:techrepublic true)} catch (IOException ex) {Console WriteLine( Error deleting directory c:techrepublic ex Message ToString())} } } } } }
列表B
Imports System IOModule Module Sub Main()Dim testPath As StringtestPath = c:test If (Path HasExtension(testPath)) ThenConsole WriteLine( This is a file path not a directory )ElseIf (Directory Exists(testPath)) ThenConsole WriteLine( This directory already exists )ElseTryDirectory CreateDirectory(testPath)Catch ex As IOExceptionConsole WriteLine( Error creating directory testPath ex Message ToString())End TryIf (Directory Exists(testPath)) ThenTryDirectory Move(testPath c:techrepublic )Catch ex As IOExceptionConsole WriteLine( Error moving directory testPath ex Message ToString())End TryEnd IfIf (Directory Exists( c:techrepublic )) ThenTryDirectory Delete( c:techrepublic True)Catch ex As IOExceptionConsole WriteLine( Error deleting directory c:techrepublic ex Message ToString())End TryEnd IfEnd IfEnd IfEnd SubEnd Module
列表C
using Systemusing System Collections Genericusing System Textusing System IOnamespace TRDirectory {class Program {static void Main(string[] args) {string curDirintitry {curDir = Directory GetCurrentDirectory()Console WriteLine( Current application directory: + curDir)subDirs = Directory GetDirectories(curDir)for (i = i <= subDirs GetUpperBound( )i++) {Console WriteLine( Subdirectory: + subDirs[i])}Console WriteLine( Root info: + Directory GetDirectoryRoot(Directory GetCurrentDirectory()))for (i = i <= Directory GetFileSystemEntries(curDir) GetUpperBound( )i++){Console WriteLine( System entries: + Directory GetFileSystemEntries(curDir)[i])}for (i = i <= Directory GetLogicalDrives() GetUpperBound( )i++) {Console WriteLine( Logical drives: + Directory GetLogicalDrives()[i])} } catch (IOException e) {Console WriteLine( Exception e Message ToString())} } } }
列表D
using Systemusing System Collections Genericusing System Textusing System IOnamespace TRDirectory {class Program {static void Main(string[] args) {string[] subDirsintiDateTimedtCreatedDateTimedtAccessedDateTimedtWritetry {subDirs = Directory GetDirectories( c: )for (i = i <= subDirs GetUpperBound( )i++) {dtCreated = Directory GetCreationTime(subDirs[i])dtAccessed = Directory GetLastAccessTime(subDirs[i])dtWrite = Directory GetLastWriteTime(subDirs[i])Console WriteLine( Subdirectory subDirs[i])Console WriteLine( Created: dtCreated ToString())Console WriteLine( Last accessed: dtAccessed ToString())Console WriteLine( Last changed: dtWrite ToString())Directory SetLastAccessTime(subDirs[i] DateTime Now)} } catch (IOException e) {Console WriteLine( Exception e Message ToString())} } } }
列表E
using Systemusing System Collections Genericusing System Textusing System IOnamespace TRDirectory {class Program {static void Main(string[] args) {string[] subDirsintiDateTimedtCreatedDateTimedtAccessedDateTimedtWritetry {subDirs = Directory GetDirectories( c: )for (i = i <= subDirs GetUpperBound( )i++) {dtCreated = Directory GetCreationTime(subDirs[i])dtAccessed = Directory GetLastAccessTime(subDirs[i])dtWrite = Directory GetLastWriteTime(subDirs[i])Console WriteLine( Subdirectory subDirs[i])Console WriteLine( Created: dtCreated ToString())Console WriteLine( Last accessed: dtAccessed ToString())Console WriteLine( Last changed: dtWrite ToString())Directory SetLastAccessTime(subDirs[i] DateTime Now)} } catch (IOException e) {Console WriteLine( Exception e Message ToString())} } } }
列表F
lishixinzhi/Article/program/net/201311/12562
获取当前程序文件的路径也算是一个比较常见的需求 比如我有一个文件conn xml位于 exe的同一目录 在运行时需要从中读取一些设置信息
string str =Process GetCurrentProcess() MainModule FileName//可获得当前执行的exe的文件名
string str =Environment CurrentDirectory//获取和设置当前目录(即该进程从中启动的目录)的完全限定路径
//备注 按照定义 如果该进程在本地或网络驱动器的根目录中启动 则此属性的值为驱动器名称后跟一个尾部反斜杠(乱凳如 C:\ ) 如果该进程在子目录中启 动 则此属性的值为不带尾部反斜杠的驱动器和子目录路径(如 C:\mySubDirectory )
string str =Directory GetCurrentDirectory()//获取应用程序的当前工作目录
string str =AppDomain CurrentDomain BaseDirectory//获取基目录 它由程序集冲突解决程序用来探测程序集
string str =Application StartupPath//获取启动了应用程序的可执行文件的路径 不包括可执行文件的名称
string str =Application ExecutablePath//获取启动了应用程序的可执行文件的路径 包括可执行文件的名称
string str =AppDomain CurrentDomain SetupInformation ApplicationBase//获取或设置包含该应用程序的目录的名称
System Diagnostics Process GetCurrentProcess() MainModule FileName
获取模块的完整路径
System Environment CurrentDirectory
获取和设置当前目录(该进程从中启动的目录)的完全限定目录
System IO Directory GetCurrentDirectory()
获取应用程序的当前工作目录 这个不一定是程序从中启动的目录啊 有可能程序放在C:\里 这个函数有可能返回C:\Documents and Settings\ZYB\ 或者C:\Program Files\Adobe\ 有时不一定返回什么东东 我也搞不懂了
System AppDomain CurrentDomain BaseDirectory
获取程序的基目录
System AppDomain CurrentDomain SetupInformation ApplicationBase
获取和设置包括该应用程序的目录的名称
System Windows Forms Application StartupPath
获取启动了应用程序的可执行文件的路径 效果和 一样 只是 返回的字符串后面多了一个 \ 而已
System Windows Forms Application ExecutablePath
获取启动了应用程序的差扰可执行文件的路径及文件名 效果和 一样
对于Windows程序 和Web 应用程序来说 他们运行的路径是不一样的 所以关键是判断当前运行的程序是哪种程序 于是我们可以使用如下的代码 string path =
if (System Environment CurrentDirectory == appDomain CurrentDomain BaseDirectory)//Windows应用程序则相等
{
path = AppDomain CurrentDomain BaseDirectory
}
else
{
path = AppDomain CurrentDomain BaseDirectory + Bin\
}
这样如果我们哗庆旅写了一个类库 类库中用到了Assembly LoadFrom 由于是通用类库 所以可能用到Windows程序中也可能用到Web中 那么用上面的代码就很方便了
Server MapPath
System Windows Forms StartupPath
Type Assembly Location
方法 可以应用于控制台应用程序 WinForm应用程序 Windows服务 方法 可以应用于Web应用程序 方法 都可以应用
但方法 是加载应用程序的路径 如果是Web应用程序 取得的路径是C:\WINDOWS\Microsoft NET\Framework\v \Temporary ASP NET Files目录 所以Web项目还是使用Server MapPath吧 否则建议使用方法 如果自己新建类库 可以加入对System Windows Forms StartupPath的引用后使用
进程对象在 NET中表现为System Diagnostics Process类 通过调用Process GetCurrentProcess() MainModule FileName可获得当前执行的exe的文件名 但是这个方法得到的仅仅是文件名 如果程序运行期间没有切换工作目录 那么可以调用System IO Path的方法获取绝对路径 但是当前目录同样可以通过Environment CurrentDirectory获得 而且很多软件在使用Open Dialog打开文件的时候 都会切换工作目录 而使得这一机制失效
如果是在Windows Forms应用程序中 当前应用也表现为System Windows Forms Application对象 通过其静态属性Application ExecutablePath和Application StartupPath 可以取得可执行文件的路径和启动路径
但如果不是在Windows应用中呢 或者是在Library中呢 就算是Application对象的属性依然能获得 也需要在工程中添加System Windows Forms这个Assembly的引用 非常不方便 这个时候 可以通过Assembly的静态方法 GetCallingAssembly或者GetExecutingAssembly取得当前执行的Assembly 然后通过Assembly类的Location获取assembly的位置
但是使用Assembly的时候 可能会遇到权限方面的问题 同时Assembly GetCallingAssembly或者Assembly GetExecutingAssembly有可能得到的不是 exe文件的位置 在GAC中的添加了强名的Assembly 运行时是可以不必与 exe在同一目录的
NET的进程启动时 会创建AppDomain 所有的Assembly都被Load到某一个AppDomain中 而AppDomain中提供了SetupInformation属性 可以获取AppDomain启动时的一些信息 因此 可以通过调用AppDomain CurrentDomain SetupInformation ApplicationBase获取当前应用程序所在的路径
在通过以上方法取到所需的目录后 可以调用System IO Path的方法获取文件名 目录名 绝对路径等 停止对路径字符串的分析 而改用System IO Path类吧
lishixinzhi/Article/program/net/201311/11363
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)