C#操作window文件目录

/// <summary>
/// 常用的目录操作辅助类
/// </summary>
public class DirectoryUtil
{
#region 目录可写与空间计算

/// <summary>
///检查目录是否可写,如果可以,返回True,否则False
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public static bool IsWriteable(string path)
{
if (!Directory.Exists(path))
{
// if the directory is not exist
try
{
// if you can create a new directory, it's mean you have write right
Directory.CreateDirectory(path);
}
catch
{
return false;
}
}


try
{
string testFileName = ".test." + Guid.NewGuid().ToString().Substring(0, 5);
string testFilePath = Path.Combine(path, testFileName);
File.WriteAllLines(testFilePath, new string[] { "test" });
File.Delete(testFilePath);
}
catch
{
return false;
}
return true;
}

/// <summary>
/// 检查磁盘是否有足够的可用空间
/// </summary>
/// <param name="path"></param>
/// <param name="requiredSpace"></param>
/// <returns></returns>
public static bool IsDiskSpaceEnough(string path, ulong requiredSpace)
{
string root = Path.GetPathRoot(path);
ulong freeSpace = GetFreeSpace(root);

return requiredSpace <= freeSpace;
}

/// <summary>
/// 获取驱动盘符的可用空间大小
/// </summary>
/// <param name="driveName">Direve name</param>
/// <returns>free space (byte)</returns>
public static ulong GetFreeSpace(string driveName)
{
ulong freefreeBytesAvailable = 0;
try
{
DriveInfo drive = new DriveInfo(driveName);
freefreeBytesAvailable = (ulong)drive.AvailableFreeSpace;
}
catch
{

}

return freefreeBytesAvailable;
}

public static ulong ConvertByteCountToKByteCount(ulong byteCount)
{
return byteCount / 1024;
}

public static float ConvertKByteCountToMByteCount(ulong kByteCount)
{
return kByteCount / 1024;
}

public static float ConvertMByteCountToGByteCount(float kByteCount)
{
return kByteCount / 1024;
}

#endregion

#region 目录操作

#region 获取指定目录中的文件列表
/// <summary>
/// 获取指定目录中所有文件列表
/// </summary>
/// <param name="directoryPath">指定目录的绝对路径</param>
public static string[] GetFileNames(string directoryPath)
{
//如果目录不存在,则抛出异常
if (!IsExistDirectory(directoryPath))
{
throw new FileNotFoundException();
}

//获取文件列表
return Directory.GetFiles(directoryPath);
}

/// <summary>
/// 获取指定目录及子目录中所有文件列表
/// </summary>
/// <param name="directoryPath">指定目录的绝对路径</param>
/// <param name="searchPattern">模式字符串,"*"代表0或N个字符,"?"代表1个字符。
/// 范例:"Log*.xml"表示搜索所有以Log开头的Xml文件。</param>
/// <param name="isSearchChild">是否搜索子目录</param>
public static string[] GetFileNames(string directoryPath, string searchPattern, bool isSearchChild)
{
//如果目录不存在,则抛出异常
if (!IsExistDirectory(directoryPath))
{
throw new FileNotFoundException();
}

try
{
if (isSearchChild)
{
return Directory.GetFiles(directoryPath, searchPattern, SearchOption.AllDirectories);
}
else
{
return Directory.GetFiles(directoryPath, searchPattern, SearchOption.TopDirectoryOnly);
}
}
catch (IOException ex)
{
throw ex;
}
}
#endregion

#region 获取指定目录中的子目录列表
/// <summary>
/// 获取指定目录中所有子目录列表,若要搜索嵌套的子目录列表,请使用重载方法.
/// </summary>
/// <param name="directoryPath">指定目录的绝对路径</param>
public static string[] GetDirectories(string directoryPath)
{
try
{
return Directory.GetDirectories(directoryPath);
}
catch (IOException ex)
{
throw ex;
}
}

/// <summary>
/// 获取指定目录及子目录中所有子目录列表
/// </summary>
/// <param name="directoryPath">指定目录的绝对路径</param>
/// <param name="searchPattern">模式字符串,"*"代表0或N个字符,"?"代表1个字符。
/// 范例:"Log*.xml"表示搜索所有以Log开头的Xml文件。</param>
/// <param name="isSearchChild">是否搜索子目录</param>
public static string[] GetDirectories(string directoryPath, string searchPattern, bool isSearchChild)
{
try
{
if (isSearchChild)
{
return Directory.GetDirectories(directoryPath, searchPattern, SearchOption.AllDirectories);
}
else
{
return Directory.GetDirectories(directoryPath, searchPattern, SearchOption.TopDirectoryOnly);
}
}
catch (IOException ex)
{
throw ex;
}
}
#endregion

#region 生成日期目录

/// <summary>
/// 生成日期 文件夹 格式:yyyy\mm\dd
/// </summary>
/// <remarks>
/// 生成时间目录 返回 例如: c:\directory\2009\03\01
/// </remarks>
/// <param name="rootPath">绝对路径 [在此目录下建日期目录]</param>
/// <returns>返回完整路径 </returns>
public static string CreateDirectoryByDate(string rootPath)
{
return CreateDirectoryByDate(rootPath, "yyyy-MM-dd");
}

/// <summary>
/// 相应格式生成日期目录
/// </summary>
/// <remarks>
/// formatString:
/// yyyy-MM-dd :2009\03\01
/// yyyy-MM-dd-HH :2009\03\01\01
/// </remarks>
/// <param name="rootPath">绝对路径 [在此目录下建日期目录]</param>
/// <param name="formatString">格式</param>
/// <returns>返回完整路径 </returns>
public static string CreateDirectoryByDate(string rootPath, string formatString)
{
if (!IsExistDirectory(rootPath))
throw new DirectoryNotFoundException("the rootPath is not found");

//小时目录
bool hour = false;

switch (formatString)
{
case "yyyy-MM-dd":
hour = false;
break;
case "yyyy-MM-dd-HH":
hour = true;
break;
default:
hour = false;
break;
}

string tempPath;

tempPath = rootPath + "\\" + DateTime.Now.Year.ToString();

CreateDirectory(tempPath);

tempPath = tempPath + "\\" + DateTime.Now.Month.ToString("00");

CreateDirectory(tempPath);

tempPath = tempPath + "\\" + DateTime.Now.Day.ToString("00");

CreateDirectory(tempPath);

if (hour)
{
tempPath = tempPath + "\\" + DateTime.Now.Hour.ToString("00");

CreateDirectory(tempPath);
}

return tempPath;
}

#endregion

/// <summary>
/// 确保文件夹被创建
/// </summary>
/// <param name="filePath">文件夹全名(含路径)</param>
public static void AssertDirExist(string filePath)
{
DirectoryInfo dir = new DirectoryInfo(filePath);
if (!dir.Exists)
{
dir.Create();
}
}

/// <summary>
/// 检测指定目录是否存在
/// </summary>
/// <param name="directoryPath">目录的绝对路径</param>
public static bool IsExistDirectory(string directoryPath)
{
return Directory.Exists(directoryPath);
}

/// <summary>
/// 检测指定目录是否为空
/// </summary>
/// <param name="directoryPath">指定目录的绝对路径</param>
public static bool IsEmptyDirectory(string directoryPath)
{
try
{
//判断是否存在文件
string[] fileNames = GetFileNames(directoryPath);
if (fileNames.Length > 0)
{
return false;
}

//判断是否存在文件夹
string[] directoryNames = GetDirectories(directoryPath);
if (directoryNames.Length > 0)
{
return false;
}

return true;
}
catch (IOException ex)
{
throw ex;
}
}

/// <summary>
/// 检测指定目录中是否存在指定的文件,若要搜索子目录请使用重载方法.
/// </summary>
/// <param name="directoryPath">指定目录的绝对路径</param>
/// <param name="searchPattern">模式字符串,"*"代表0或N个字符,"?"代表1个字符。
/// 范例:"Log*.xml"表示搜索所有以Log开头的Xml文件。</param>
public static bool ContainFile(string directoryPath, string searchPattern)
{
try
{
//获取指定的文件列表
string[] fileNames = GetFileNames(directoryPath, searchPattern, false);

//判断指定文件是否存在
if (fileNames.Length == 0)
{
return false;
}
else
{
return true;
}
}
catch (IOException ex)
{
throw ex;
}
}

/// <summary>
/// 检测指定目录中是否存在指定的文件
/// </summary>
/// <param name="directoryPath">指定目录的绝对路径</param>
/// <param name="searchPattern">模式字符串,"*"代表0或N个字符,"?"代表1个字符。
/// 范例:"Log*.xml"表示搜索所有以Log开头的Xml文件。</param>
/// <param name="isSearchChild">是否搜索子目录</param>
public static bool ContainFile(string directoryPath, string searchPattern, bool isSearchChild)
{
try
{
//获取指定的文件列表
string[] fileNames = GetFileNames(directoryPath, searchPattern, true);

//判断指定文件是否存在
if (fileNames.Length == 0)
{
return false;
}
else
{
return true;
}
}
catch (IOException ex)
{
throw ex;
}
}

/// <summary>
/// 创建一个目录
/// </summary>
/// <param name="directoryPath">目录的绝对路径</param>
public static void CreateDirectory(string directoryPath)
{
//如果目录不存在则创建该目录
if (!IsExistDirectory(directoryPath))
{
Directory.CreateDirectory(directoryPath);
}
}

/// <summary>
/// 清空指定目录下所有文件及子目录,但该目录依然保存.
/// </summary>
/// <param name="directoryPath">指定目录的绝对路径</param>
public static void ClearDirectory(string directoryPath)
{
if (IsExistDirectory(directoryPath))
{
//删除目录中所有的文件
string[] fileNames = GetFileNames(directoryPath);
for (int i = 0; i < fileNames.Length; i++)
{
FileUtil.DeleteFile(fileNames[i]);
}

//删除目录中所有的子目录
string[] directoryNames = GetDirectories(directoryPath);
for (int i = 0; i < directoryNames.Length; i++)
{
DeleteDirectory(directoryNames[i]);
}
}
}

/// <summary>
/// 删除指定目录及其所有子目录
/// </summary>
/// <param name="directoryPath">指定目录的绝对路径</param>
public static void DeleteDirectory(string directoryPath)
{
if (IsExistDirectory(directoryPath))
{
Directory.Delete(directoryPath, true);
}
}

/// <summary>
/// 取系统目录
/// </summary>
/// <returns></returns>
public static string GetSystemDirectory()
{
return System.Environment.SystemDirectory;
}

/// <summary>
/// 取系统的特别目录
/// </summary>
/// <param name="folderType"></param>
/// <returns></returns>
public static string GetSpeicalFolder(Environment.SpecialFolder folderType)
{
return System.Environment.GetFolderPath(folderType);
}

/// <summary>
/// 返回当前系统的临时目录
/// </summary>
/// <returns></returns>
public static string GetTempPath()
{
return Path.GetTempPath();
}

/// <summary>
/// 取当前目录
/// </summary>
/// <returns></returns>
public static string GetCurrentDirectory()
{
return Directory.GetCurrentDirectory();
}

/// <summary>
/// 设当前目录
/// </summary>
/// <param name="path"></param>
public static void SetCurrentDirectory(string path)
{
Directory.SetCurrentDirectory(path);
}

/// <summary>
/// 取路径中不充许存在的字符
/// </summary>
/// <returns></returns>
public static char[] GetInvalidPathChars()
{
return Path.GetInvalidPathChars();
}

/// <summary>
/// 取系统所有的逻辑驱动器
/// </summary>
/// <returns></returns>
public static DriveInfo[] GetAllDrives()
{
return DriveInfo.GetDrives();
}

#endregion

}

posted @ 2021-10-22 09:31  龙丶谈笑风声  阅读(191)  评论(0编辑  收藏  举报