前段时间写了个简单的文件操作类,但是总感觉这个设计模式不是很好,没有体现OOP的概念出来,想做先设计一个File对象,然后其他的对File的Action可以相继派生,不知道各位高手觉得如何?有没有必要呢?下面是源代码:
using System;
using System.IO;
using System.Globalization;
namespace LJF.Lib.Common.Utility
{
/// <summary>
/// some operation for file
/// </summary>
public class FileUtility
{
private static int counter = -1;
private static Object tmpFileLock = new Object();
/// <summary>
/// Check Dir
/// </summary>
/// <param name="directory"></param>
public static void CheckDir(String directory)
{
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
}
/// <summary>
///
/// </summary>
/// <param name="fileName"></param>
/// <param name="directoryPath"></param>
/// <returns></returns>
public static FileInfo CreateUniqueFile(string fileName,string directoryPath)
{
if (fileName == null) throw new ArgumentNullException("File name cannot be empty.");
if (directoryPath == null)throw new ArgumentNullException("Directory path cannot be empty");
int index = fileName.LastIndexOf(".");
if (index == -1) throw new Exception("Prefix too short.");
string prefix = fileName.Substring(0,index);
string suffix = fileName.Substring(index);
return CreateUniqueFile(prefix,suffix,directoryPath);
}
/// <summary>
///
/// </summary>
/// <param name="prefix"></param>
/// <param name="suffix"></param>
/// <param name="directory"></param>
/// <returns></returns>
public static FileInfo CreateUniqueFile(string prefix, string suffix,string directory)
{
if (prefix == null)throw new Exception("");
String s = (suffix == null) ? ".tmp" : suffix;
lock (tmpFileLock)
{
FileInfo f;
do
{
f = GenerateFile(prefix, s, directory);
}while(f.Exists);
return f;
}
}
/// <summary>
///
/// </summary>
/// <param name="prefix"></param>
/// <param name="suffix"></param>
/// <param name="dir"></param>
/// <returns></returns>
private static FileInfo GenerateFile(string prefix,string suffix,string dir)
{
if (counter == -1)
{
counter = new Random().Next() & 0xffff;
}
counter ++;
return new FileInfo(dir + prefix + counter.ToString() + suffix);
}
/// <summary>
/// set the file's attributes writable
/// </summary>
/// <param name="filePath"></param>
public static void ChangeFileAttributesToWritable(string filePath)
{
if (!File.Exists(filePath))
{
return;
}
FileAttributes attributes = File.GetAttributes(filePath);
FileAttributes attr = attributes | FileAttributes.ReadOnly;
if (attr == attributes)
{
attributes ^= FileAttributes.ReadOnly;
File.SetAttributes(filePath, attributes);
}
}
/// <summary>
/// if the file is read only
/// </summary>
/// <param name="filePath"></param>
/// <returns></returns>
public static bool IsFileReadOnly(string filePath)
{
if (!File.Exists(filePath))
{
return false;
}
FileAttributes attributes = File.GetAttributes(filePath);
FileAttributes attr = attributes | FileAttributes.ReadOnly;
if (attr == attributes)
{
return true;
}
return false;
}
/// <summary>
/// get a file as base64 string
/// </summary>
/// <param name="inputStream"></param>
/// <returns></returns>
public static string GetBase64FromStream(Stream inputStream)
{
int Count = 0;
byte[] b = new byte[inputStream.Length] ;
while(Count < inputStream.Length-1)
{
int RealCount = inputStream.Read(b,Count,1024);
Count = Count+RealCount;
}
inputStream.Flush();
inputStream.Close();
string strContent = Convert.ToBase64String(b);
return strContent;
}
/// <summary>
/// Get a string can be a file name, creat by date time now
/// </summary>
/// <returns></returns>
public static string GetFileNameByDateTimeNow()
{
return DateTime.Now.ToString("yyyyMMdd_HHmmss_fffffff", DateTimeFormatInfo.InvariantInfo);
}
/// <summary>
/// get the file name by path.
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public string GetFileName(string path)
{
return System.IO.Path.GetFileName(path);
}
/// <summary>
/// get the file name with out extension by path
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public string GetFileNameWithoutExtension(string path)
{
return System.IO.Path.GetFileNameWithoutExtension(path);
}
/// <summary>
/// get the file's extension by path
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public string GetFileNameExtension(string path)
{
return System.IO.Path.GetExtension(path);
}
}//end class
}