C#常用的IO操作方法,
public class IoHelper
{
/// <summary>
/// 判斷文件是否存在
/// </summary>
/// <param name="fileName">文件路徑</param>
/// <returns>是否存在</returns>
public static bool Exists(string fileName)
{
if (fileName == null || fileName.Trim() == "")
{
return false;
}
return File.Exists(fileName);
}
/// <summary>
/// 創建文件夾
/// </summary>
/// <param name="dirName">文件夾名</param>
/// <returns></returns>
public static bool CreateDir(string dirName)
{
try
{
if (dirName == null)
throw new Exception("dirName");
if (!Directory.Exists(dirName))
{
Directory.CreateDirectory(dirName);
}
return true;
}
catch (Exception er)
{
throw new Exception(er.Message);
}
}
/// <summary>
/// 創建文件
/// </summary>
/// <param name="fileName">文件名</param>
/// <returns>創建失敗返回false</returns>
public static bool CreateFile(string fileName)
{
try
{
if (File.Exists(fileName)) return false;
var fs = File.Create(fileName);
fs.Close();
fs.Dispose();
}
catch (IOException ioe)
{
throw new IOException(ioe.Message);
}
return true;
}
/// <summary>
/// 讀文件內容,轉化為字符類型
/// </summary>
/// <param name="fileName">文件路徑</param>
/// <returns></returns>
public static string Read(string fileName)
{
if (!Exists(fileName))
{
return null;
}
//將文件信息讀入流中
using (var fs = new FileStream(fileName, FileMode.Open))
{
return new StreamReader(fs).ReadToEnd();
}
}
/// <summary>
/// 文件轉化為Char[]數組
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
public static char[] FileRead(string fileName)
{
if (!Exists(fileName))
{
return null;
}
var byData = new byte[1024];
var charData = new char[1024];
try
{
var fileStream = new FileStream(fileName, FileMode.Open);
fileStream.Seek(135, SeekOrigin.Begin);
fileStream.Read(byData, 0, 1024);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
var decoder = Encoding.UTF8.GetDecoder();
decoder.GetChars(byData, 0, byData.Length, charData, 0);
return charData;
}
/// <summary>
/// 文件轉化為byte[]
/// </summary>
/// <param name="fileName">文件路徑</param>
/// <returns></returns>
public static byte[] ReadFile(string fileName)
{
FileStream pFileStream = null;
try
{
pFileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
var r = new BinaryReader(pFileStream);
//將文件指針設置到文件開
r.BaseStream.Seek(0, SeekOrigin.Begin);
var pReadByte = r.ReadBytes((int)r.BaseStream.Length);
return pReadByte;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
if (pFileStream != null) pFileStream.Close();
}
}
/// <summary>
/// 將byte寫入文件
/// </summary>
/// <param name="pReadByte">字節流</param>
/// <param name="fileName">文件路徑</param>
/// <returns></returns>
public static bool WriteFile(byte[] pReadByte, string fileName)
{
FileStream pFileStream = null;
try
{
pFileStream = new FileStream(fileName, FileMode.OpenOrCreate);
pFileStream.Write(pReadByte, 0, pReadByte.Length);
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
if (pFileStream != null) pFileStream.Close();
}
return true;
}
public static string ReadLine(string fileName)
{
if (!Exists(fileName))
{
return null;
}
using (var fs = new FileStream(fileName, FileMode.Open))
{
return new StreamReader(fs).ReadLine();
}
}
/// <summary>
/// 寫文件
/// </summary>
/// <param name="fileName">文件名</param>
/// <param name="content">文件內容</param>
/// <returns></returns>
public static bool Write(string fileName, string content)
{
if (Exists(fileName) || content == null)
{
return false;
}
try
{
//將文件信息讀入流中
//初始化System.IO.FileStream類的新實例與指定路徑和創建模式
using (var fs = new FileStream(fileName, FileMode.OpenOrCreate))
{
//鎖住流
lock (fs)
{
if (!fs.CanWrite)
{
throw new System.Security.SecurityException("文件fileName=" + fileName + "是只讀文件不能寫入!");
}
var buffer = Encoding.Default.GetBytes(content);
fs.Write(buffer, 0, buffer.Length);
return true;
}
}
}
catch (IOException ioe)
{
throw new Exception(ioe.Message);
}
}
/// <summary>
/// 寫入一行
/// </summary>
/// <param name="fileName">文件名</param>
/// <param name="content">內容</param>
/// <returns></returns>
public static bool WriteLine(string fileName, string content)
{
if (string.IsNullOrEmpty(fileName))
throw new ArgumentNullException(fileName);
if (string.IsNullOrEmpty(content))
throw new ArgumentNullException(content);
using (var fs = new FileStream(fileName, FileMode.OpenOrCreate | FileMode.Append))
{
//鎖住流
lock (fs)
{
if (!fs.CanWrite)
{
throw new System.Security.SecurityException("文件fileName=" + fileName + "是只讀文件不能寫入!");
}
var sw = new StreamWriter(fs);
sw.WriteLine(content);
sw.Dispose();
sw.Close();
return true;
}
}
}
/// <summary>
/// 復制目錄
/// </summary>
/// <param name="fromDir">被復制的目錄</param>
/// <param name="toDir">復制到的目錄</param>
/// <returns></returns>
public static bool CopyDir(DirectoryInfo fromDir, string toDir)
{
return CopyDir(fromDir, toDir, fromDir.FullName);
}
/// <summary>
/// 復制目錄
/// </summary>
/// <param name="fromDir">被復制的目錄</param>
/// <param name="toDir">復制到的目錄</param>
/// <returns></returns>
public static bool CopyDir(string fromDir, string toDir)
{
if (fromDir == null || toDir == null)
{
throw new NullReferenceException("參數為空");
}
if (fromDir == toDir)
{
throw new Exception("兩個目錄都是" + fromDir);
}
if (!Directory.Exists(fromDir))
{
throw new IOException("目錄fromDir=" + fromDir + "不存在");
}
var dir = new DirectoryInfo(fromDir);
return CopyDir(dir, toDir, dir.FullName);
}
/// <summary>
/// 復制目錄
/// </summary>
/// <param name="fromDir">被復制的目錄</param>
/// <param name="toDir">復制到的目錄</param>
/// <param name="rootDir">被復制的根目錄</param>
/// <returns></returns>
private static bool CopyDir(DirectoryInfo fromDir, string toDir, string rootDir)
{
foreach (var f in fromDir.GetFiles())
{
var filePath = toDir + f.FullName.Substring(rootDir.Length);
var newDir = filePath.Substring(0, filePath.LastIndexOf("\\", StringComparison.Ordinal));
CreateDir(newDir);
File.Copy(f.FullName, filePath, true);
}
foreach (var dir in fromDir.GetDirectories())
{
CopyDir(dir, toDir, rootDir);
}
return true;
}
/// <summary>
/// 刪除文件
/// </summary>
/// <param name="fileName">文件的完整路徑</param>
/// <returns></returns>
public static bool DeleteFile(string fileName)
{
try
{
if (!Exists(fileName)) return false;
File.Delete(fileName);
}
catch (IOException ioe)
{
throw new ArgumentNullException(ioe.Message);
}
return true;
}
public static void DeleteDir(DirectoryInfo dir)
{
if (dir == null)
{
throw new NullReferenceException("目錄不存在");
}
foreach (var d in dir.GetDirectories())
{
DeleteDir(d);
}
foreach (var f in dir.GetFiles())
{
DeleteFile(f.FullName);
}
dir.Delete();
}
/// <summary>
/// 刪除目錄
/// </summary>
/// <param name="dir">指定目錄</param>
/// <param name="onlyDir">是否只刪除目錄</param>
/// <returns></returns>
public static bool DeleteDir(string dir, bool onlyDir)
{
if (dir == null || dir.Trim() == "")
{
throw new NullReferenceException("目錄dir=" + dir + "不存在");
}
if (!Directory.Exists(dir))
{
return false;
}
var dirInfo = new DirectoryInfo(dir);
if (dirInfo.GetFiles().Length == 0 && dirInfo.GetDirectories().Length == 0)
{
Directory.Delete(dir);
return true;
}
if (!onlyDir)
{
return false;
}
DeleteDir(dirInfo);
return true;
}
/// <summary>
/// 在指定的目錄中查找文件
/// </summary>
/// <param name="dir">目錄</param>
/// <param name="fileName">文件名</param>
/// <returns></returns>
public static bool FindFile(string dir, string fileName)
{
if (dir == null || dir.Trim() == "" || fileName == null || fileName.Trim() == "" || !Directory.Exists(dir))
{
return false;
}
//傳入文件路徑,獲取當前文件對象
var dirInfo = new DirectoryInfo(dir);
return FindFile(dirInfo, fileName);
}
/// <summary>
/// 返回文件是否存在
/// </summary>
/// <param name="dir"></param>
/// <param name="fileName"></param>
/// <returns></returns>
public static bool FindFile(DirectoryInfo dir, string fileName)
{
foreach (var d in dir.GetDirectories())
{
if (File.Exists(d.FullName + "\\" + fileName))
{
return true;
}
FindFile(d, fileName);
}
return false;
}
/// <summary>
/// 獲取指定文件夾中的所有文件夾名稱
/// </summary>
/// <param name="folderPath">路徑</param>
/// <returns></returns>
public static List<string> FolderName(string folderPath)
{
var listFolderName = new List<string>();
try
{
var info = new DirectoryInfo(folderPath);
listFolderName.AddRange(info.GetDirectories().Select(nextFolder => nextFolder.Name));
}
catch (Exception er)
{
throw new Exception(er.Message);
}
return listFolderName;
}
/// <summary>
/// 獲取指定文件夾中的文件名稱
/// </summary>
/// <param name="folderPath">路徑</param>
/// <returns></returns>
public static List<string> FileName(string folderPath)
{
var listFileName = new List<string>();
try
{
var info = new DirectoryInfo(folderPath);
listFileName.AddRange(info.GetFiles().Select(nextFile => nextFile.Name));
}
catch (Exception er)
{
throw new Exception(er.Message);
}
return listFileName;
}
}