using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
namespace ryCommon
{
///
/// 文件操作类
///
public class RyFiles
{
#region 【内部类型定义】
private struct SHFILEOPSTRUCT
{
public IntPtr hwnd; //父窗口句柄
public WFunc wFunc; //要执行的动作
public string pFrom; //源文件路径,可以是多个文件,以结尾符号"\0"结束
public string pTo; //目标路径,可以是路径或文件名
public FILEOP_FLAGS fFlags; //标志,附加选项
public bool fAnyOperationsAborted; //是否可被中断
public IntPtr hNameMappings; //文件映射名字,可在其它 Shell 函数中使用
public string lpszProgressTitle; // 只在 FOF_SIMPLEPROGRESS 时,指定对话框的标题。
}
private enum WFunc
{
FO_MOVE = 0x0001, //移动文件
FO_COPY = 0x0002, //复制文件
FO_DELETE = 0x0003, //删除文件,只是用pFrom
FO_RENAME = 0x0004 //文件重命名
}
private enum FILEOP_FLAGS
{
FOF_MULTIDESTFILES = 0x0001, //pTo 指定了多个目标文件,而不是单个目录
FOF_CONFIRMMOUSE = 0x0002,
FOF_SILENT = 0x0044, // 不显示一个进度对话框
FOF_RENAMEONCOLLISION = 0x0008, // 碰到有抵触的名字时,自动分配前缀
FOF_NOCONFIRMATION = 0x10, // 不对用户显示提示
FOF_WANTMAPPINGHANDLE = 0x0020, // 填充 hNameMappings 字段,必须使用 SHFreeNameMappings 释放
FOF_ALLOWUNDO = 0x40, // 允许撤销
FOF_FILESONLY = 0x0080, // 使用 *.* 时, 只对文件操作
FOF_SIMPLEPROGRESS = 0x0100, // 简单进度条,意味者不显示文件名。
FOF_NOCONFIRMMKDIR = 0x0200, // 建新目录时不需要用户确定
FOF_NOERRORUI = 0x0400, // 不显示出错用户界面
FOF_NOCOPYSECURITYATTRIBS = 0x0800, // 不复制 NT 文件的安全属性
FOF_NORECURSION = 0x1000 // 不递归目录
}
#endregion 【内部类型定义】
#region 【DllImport】
[DllImport("shell32.dll")]
private static extern int SHFileOperation(ref SHFILEOPSTRUCT lpFileOp);
///
///
///
public enum ShowCommands : int
{
///
///
///
SW_HIDE = 0,
///
///
///
SW_SHOWNORMAL = 1,
///
///
///
SW_NORMAL = 1,
///
///
///
SW_SHOWMINIMIZED = 2,
///
///
///
SW_SHOWMAXIMIZED = 3,
///
///
///
SW_MAXIMIZE = 3,
///
///
///
SW_SHOWNOACTIVATE = 4,
///
///
///
SW_SHOW = 5,
///
///
///
SW_MINIMIZE = 6,
///
///
///
SW_SHOWMINNOACTIVE = 7,
///
///
///
SW_SHOWNA = 8,
///
///
///
SW_RESTORE = 9,
///
///
///
SW_SHOWDEFAULT = 10,
///
///
///
SW_FORCEMINIMIZE = 11,
///
///
///
SW_MAX = 11
}
[DllImport("shell32.dll", CharSet = CharSet.Unicode)]
static extern int ShellExecute(
IntPtr hwnd,
string lpOperation,
string lpFile,
string lpParameters,
string lpDirectory,
ShowCommands nShowCmd);
#endregion 【DllImport】
#region 【删除文件操作】
///
/// 删除单个文件。
///
/// 删除的文件名
/// 指示是将文件放入回收站还是永久删除,true-放入回收站,false-永久删除
/// 指示是否显示确认对话框,true-显示确认删除对话框,false-不显示确认删除对话框
/// 指示是否显示进度对话框,true-显示,false-不显示。该参数当指定永久删除文件时有效
/// 反馈错误消息的字符串
/// 操作执行结果标识,删除文件成功返回0,否则,返回错误代码
public static int DeleteFile(string fileName, bool toRecycle, bool showDialog, bool showProgress, ref string errorMsg)
{
try
{
string fName = fileName;
if (fileName.IndexOf("*") < 0 && fileName.IndexOf("?") < 0)
{
fName = GetFullName(fileName);
}
return ToDelete(fName, toRecycle, showDialog, showProgress, ref errorMsg);
}
catch (Exception ex)
{
errorMsg = ex.Message;
return -200;
}
}
///
/// 删除单个文件。
///
/// 删除的文件名
/// 指示是将文件放入回收站还是永久删除,true-放入回收站,false-永久删除
/// 操作执行结果标识,删除文件成功返回0,否则,返回错误代码
public static int DeleteFile(string fileName, bool toRecycle)
{
string errorMsg = "";
return DeleteFile(fileName,toRecycle,false,false,ref errorMsg);
}
///
/// 永久删除单个文件。
///
/// 永久删除的文件名
/// 操作执行结果标识,删除文件成功返回0,否则,返回错误代码
public static int DeleteFile(string fileName)
{
return DeleteFile(fileName, false);
}
///
/// 删除一组文件。
///
/// 字符串数组,表示一组文件名
/// 指示是将文件放入回收站还是永久删除,true-放入回收站,false-永久删除
/// 指示是否显示确认对话框,true-显示确认删除对话框,false-不显示确认删除对话框
/// 指示是否显示进度对话框,true-显示,false-不显示。该参数当指定永久删除文件时有效
/// 反馈错误消息的字符串
/// 操作执行结果标识,删除文件成功返回0,否则,返回错误代码
public static int DeleteFiles(string[] fileNames, bool toRecycle, bool showDialog, bool showProgress, ref string errorMsg)
{
try
{
string fName = "";
foreach (string str in fileNames)
{
fName += GetFullName(str) + "\0"; //组件文件组字符串
}
return ToDelete(fName, toRecycle, showDialog, showProgress, ref errorMsg);
}
catch (Exception ex)
{
errorMsg = ex.Message;
return -200;
}
}
#endregion 【删除文件操作】
#region 【移动文件操作】
///
/// 移动文件到指定路径下
///
/// 要移动的文件名
/// 移动到的目的路径
///
public static int MoveFile(string sourceFileName, string destinationPath)
{
string errorMsg = "";
return MoveFile(sourceFileName, destinationPath,false,false,false,ref errorMsg);
}
///
/// 移动一个文件到指定路径下
///
/// 要移动的文件名
/// 移动到的目的路径
/// 指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框
/// 指示是否显示进度对话框
/// 指示当文件名重复时,是否自动为新文件加上后缀名
/// 反馈错误消息的字符串
/// 返回移动操作是否成功的标识,成功返回0,失败返回错误代码
public static int MoveFile(string sourceFileName, string destinationPath, bool showDialog, bool showProgress, bool autoRename, ref string errorMsg)
{
try
{
string sfName = GetFullName(sourceFileName);
string dfName = GetFullName(destinationPath);
return ToMoveOrCopy(WFunc.FO_MOVE, sfName, dfName, showDialog, showProgress, autoRename, ref errorMsg);
}
catch (Exception ex)
{
errorMsg = ex.Message;
return -200;
}
}
///
/// 移动一组文件到指定的路径下
///
/// 要移动的文件名数组
/// 移动到的目的路径
/// 指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框
/// 指示是否显示进度对话框
/// 指示当文件名重复时,是否自动为新文件加上后缀名
/// 反馈错误消息的字符串
/// 返回移动操作是否成功的标识,成功返回0,失败返回错误代码,-200:表示其他异常
public static int MoveFiles(string[] sourceFileNames, string destinationPath, bool showDialog, bool showProgress, bool autoRename, ref string errorMsg)
{
try
{
string sfName = "";
foreach (string str in sourceFileNames)
{
sfName += GetFullName(str) + "\0"; //组件文件组字符串
}
string dfName = GetFullName(destinationPath);
return ToMoveOrCopy(WFunc.FO_MOVE, sfName, dfName, showDialog, showProgress, autoRename, ref errorMsg);
}
catch (Exception ex)
{
errorMsg = ex.Message;
return -200;
}
}
#endregion 【移动文件操作】
#region 【复制文件操作】
///
/// 复制文件到指定的文件名或路径
///
/// 要复制的文件名
/// 复制到的目的文件名或路径
///
public static int CopyFile(string sourceFileName, string destinationFileName)
{
string errorMsg = "";
return CopyFile(sourceFileName, destinationFileName,false,false,false,ref errorMsg);
}
///
/// 复制文件到指定的文件名或路径
///
/// 要复制的文件名
/// 复制到的目的文件名或路径
/// 指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框
/// 指示是否显示进度对话框
/// 指示当文件名重复时,是否自动为新文件加上后缀名
/// 返回错误信息
/// 返回移动操作是否成功的标识,成功返回0,失败返回错误代码,-200:表示其他异常
public static int CopyFile(string sourceFileName, string destinationFileName, bool showDialog, bool showProgress, bool autoRename, ref string errorMsg)
{
try
{
string sfName = sourceFileName;
string dfName = destinationFileName;
return ToMoveOrCopy(WFunc.FO_COPY, sfName, dfName, showDialog, showProgress, autoRename, ref errorMsg);
}
catch (Exception ex)
{
errorMsg = ex.Message;
return -200;
}
}
///
/// 复制一组文件到指定的路径
///
/// 要复制的文件名数组
/// 复制到的目的路径
/// 指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框
/// 指示是否显示进度对话框
/// 指示当文件名重复时,是否自动为新文件加上后缀名
/// 返回错误信息
/// 返回移动操作是否成功的标识,成功返回0,失败返回错误代码,-200:表示其他异常
public static int CopyFiles(string[] sourceFileNames, string destinationPath, bool showDialog, bool showProgress, bool autoRename, ref string errorMsg)
{
try
{
string sfName = "";
foreach (string str in sourceFileNames)
{
sfName += GetFullName(str) + "\0"; //组件文件组字符串
}
string dfName = GetFullName(destinationPath);
return ToMoveOrCopy(WFunc.FO_COPY, sfName, dfName, showDialog, showProgress, autoRename, ref errorMsg);
}
catch (Exception ex)
{
errorMsg = ex.Message;
return -200;
}
}
#endregion 【复制文件操作】
#region 【重命名文件】
///
/// 重命名一个文件为新名称,建议您使用更方便的Microsoft.VisualBasic.FileSystem.ReName();替换该方法
///
/// 要复制的文件名
/// 复制到的目的文件名或路径
/// 指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框
/// 返回错误信息
/// 返回移动操作是否成功的标识,成功返回0,失败返回错误代码,-200:表示其他异常
[Obsolete("建议使用 Microsoft.VisualBasic.FileSystem.ReName()方法")]
public static int ReNameFile(string sourceFileName, string destinationFileName, bool showDialog, ref string errorMsg)
{
try
{
SHFILEOPSTRUCT lpFileOp = new SHFILEOPSTRUCT()
{
wFunc = WFunc.FO_RENAME,
pFrom = GetFullName(sourceFileName) + "\0\0", //将文件名以结尾字符"\0\0"结束
pTo = GetFullName(destinationFileName) + "\0\0",
fFlags = FILEOP_FLAGS.FOF_NOERRORUI
};
if (!showDialog)
lpFileOp.fFlags |= FILEOP_FLAGS.FOF_NOCONFIRMATION; //设定不显示提示对话框
lpFileOp.fAnyOperationsAborted = true;
int n = SHFileOperation(ref lpFileOp);
if (n == 0)
return 0;
string tmp = GetErrorString(n);
errorMsg = string.Format("{0}({1})", tmp, sourceFileName);
return n;
}
catch (Exception ex)
{
errorMsg = ex.Message;
return -200;
}
}
#endregion 【重命名文件】
///
/// 删除单个或多个文件
///
/// 删除的文件名,如果是多个文件,文件名之间以字符串结尾符'\0'隔开
/// 指示是将文件放入回收站还是永久删除,true-放入回收站,false-永久删除
/// 指示是否显示确认对话框,true-显示确认删除对话框,false-不显示确认删除对话框
/// 指示是否显示进度对话框,true-显示,false-不显示。该参数当指定永久删除文件时有效
/// 反馈错误消息的字符串
/// 操作执行结果标识,删除文件成功返回0,否则,返回错误代码
private static int ToDelete(string fileName, bool toRecycle, bool showDialog, bool showProgress, ref string errorMsg)
{
SHFILEOPSTRUCT lpFileOp = new SHFILEOPSTRUCT()
{
wFunc = WFunc.FO_DELETE,
pFrom = fileName + "\0" //将文件名以结尾字符"\0"结束
};
lpFileOp.fFlags = FILEOP_FLAGS.FOF_NOERRORUI;
if (!showDialog)
lpFileOp.fFlags |= FILEOP_FLAGS.FOF_NOCONFIRMATION; //设定不显示提示对话框
if (!showProgress)
lpFileOp.fFlags |= FILEOP_FLAGS.FOF_SILENT; //设定不显示进度对话框
if (!toRecycle)
lpFileOp.fFlags &= ~FILEOP_FLAGS.FOF_ALLOWUNDO; //设定删除到回收站
lpFileOp.fAnyOperationsAborted = true;
int n = SHFileOperation(ref lpFileOp);
if (n == 0)
return 0;
string tmp = GetErrorString(n);
//.av 文件正常删除了但也提示 402 错误,不知道为什么。屏蔽之。
if ((fileName.ToLower().EndsWith(".av") && n.ToString("X") == "402"))
return 0;
errorMsg = string.Format("{0}({1})", tmp, fileName);
return n;
}
///
/// 移动或复制一个或多个文件到指定路径下
///
/// 操作类型,是移动操作还是复制操作
/// 要移动或复制的文件名,如果是多个文件,文件名之间以字符串结尾符'\0'隔开
/// 移动到的目的位置
/// 指示是否显示确认对话框,true-显示确认对话框,false-不显示确认对话框
/// 指示是否显示进度对话框
/// 指示当文件名重复时,是否自动为新文件加上后缀名
/// 反馈错误消息的字符串
/// 返回移动操作是否成功的标识,成功返回0,失败返回错误代码
private static int ToMoveOrCopy(WFunc flag, string sourceFileName, string destinationFileName, bool showDialog, bool showProgress, bool autoRename, ref string errorMsg)
{
SHFILEOPSTRUCT lpFileOp = new SHFILEOPSTRUCT()
{
wFunc = flag,
pFrom = sourceFileName + "\0", //将文件名以结尾字符"\0\0"结束
pTo = destinationFileName + "\0\0"
};
lpFileOp.fFlags = FILEOP_FLAGS.FOF_NOERRORUI;
lpFileOp.fFlags |= FILEOP_FLAGS.FOF_NOCONFIRMMKDIR; //指定在需要时可以直接创建路径
if (!showDialog)
lpFileOp.fFlags |= FILEOP_FLAGS.FOF_NOCONFIRMATION; //设定不显示提示对话框
if (!showProgress)
lpFileOp.fFlags |= FILEOP_FLAGS.FOF_SILENT; //设定不显示进度对话框
if (autoRename)
lpFileOp.fFlags |= FILEOP_FLAGS.FOF_RENAMEONCOLLISION; //自动为重名文件添加名称后缀
lpFileOp.fAnyOperationsAborted = true;
int n = SHFileOperation(ref lpFileOp);
if (n == 0)
return 0;
string tmp = GetErrorString(n);
errorMsg = string.Format("{0}({1})", tmp, sourceFileName);
return n;
}
///
/// 如果指定文件夹不存在,则创建文件夹
///
///
public static void CreateDirectory(string path)
{
if(!System.IO.Directory.Exists(path))
{
System.IO.Directory.CreateDirectory(path);
}
}
///
/// 获取一个文件的全名
///
/// 文件名
/// 返回生成文件的完整路径名
private static string GetFullName(string fileName)
{
FileInfo fi = new FileInfo(fileName);
return fi.FullName;
}
///
/// 获取一个文件的全名
///
/// 文件名
/// 返回生成文件的完整路径名
public static sType.FileTime GetFileDate(string fileName)
{
var result = new sType.FileTime();
FileInfo fi = new FileInfo(fileName);
result.AccessTime = fi.LastAccessTime;
result.CreateTime = fi.CreationTime;
result.LastWriteTime = fi.LastWriteTime;
return result;
}
///
/// 解释错误代码
///
/// 代码号
/// 返回关于错误代码的文字描述
private static string GetErrorString(int n)
{
if (n == 0) return string.Empty;
switch (n)
{
case 2:
return "系统找不到指定的文件。";
case 7:
return "存储控制块被销毁。您是否选择的“取消”操作?";
case 113:
return "文件已存在!";
case 115:
return "重命名文件操作,原始文件和目标文件必须具有相同的路径名。不能使用相对路径。";
case 117:
return "I/O控制错误";
case 123:
return "指定了重复的文件名";
case 116:
return "The source is a root directory, which cannot be moved or renamed.";
case 118:
return "Security settings denied access to the source.";
case 124:
return "The path in the source or destination or both was invalid.";
case 65536:
return "An unspecified error occurred on the destination.";
case 1026:
return "在试图移动或拷贝一个不存在的文件.";
case 1223:
return "操作被取消!";
default:
return "未识别的错误代码:" + n;
}
}
///
/// 运行文件
///
///
///
///
public static int RunFile(string FilePath, string PramCom)
{
return RunFile(FilePath, PramCom,"");
}
///
/// /运行文件
///
///
///
///
///
public static int RunFile(string FilePath, string PramCom,string lpDirectory)
{
try
{
return ShellExecute(IntPtr.Zero, "open", FilePath, PramCom, lpDirectory, ShowCommands.SW_SHOWNORMAL);
//System.Diagnostics.Process.Start(FilePath, PramCom);
//return 1;
}
catch { return 0; }
}
///
/// 运行程序
///
///
///
public static int RunProc(string FilePath)
{
return RunFile(FilePath, "");
}
///
/// 打开文件
///
///
///
public static int OpenFile(string FilePath)
{
return RunFile(FilePath, "");
}
[DllImport("Kernel32", CharSet = CharSet.Unicode)]
private static extern Int32 GetShortPathName(String path, StringBuilder shortPath, Int32 shortPathLength);
///
/// 打开文件夹并定位文件
///
///
///
public static int OpenFolderGotoFile(string FilePath)
{
StringBuilder shortpath = new StringBuilder(260);
int result = GetShortPathName(FilePath, shortpath, shortpath.Capacity);
return RunFile("explorer.exe", "/select,\""+ shortpath.ToString()+ "\"");
}
///
/// 打开网址
///
///
///
public static int OpenUrl(string url)
{
return RunFile(url, "");
}
///
/// 判断文件名是否有效
///
///
///
public static bool IsValidFileName(string filename)
{
char[] no_validstr = @":\/|*?<>""".ToCharArray();
for(int i=0;i=0)
{
return false;
}
}
return true;
}
///
/// 转换到有效文件名
///
///
///
public static string ConvertToValidFileName(string filename)
{
char[] no_validstr = @":\/|*?<>""".ToCharArray();
string _file = filename;
for (int i = 0; i < no_validstr.Length; i++)
{
_file = _file.Replace(no_validstr[i].ToString(), "");
}
return _file;
}
///
/// 追加日志
///
///
///
public void AppendLogs(string path, string content)
{
AppendAllText(path, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\t" + content);
}
///
/// 追加文件
///
///
///
public void AppendAllText(string path, string content)
{
if (!System.IO.File.Exists(path))
{
RyFiles.WriteAllText(path, content, Encoding.UTF8);
}
else
{
System.IO.File.AppendAllText(path, "\r\n" +content, Encoding.UTF8);
}
}
///
/// 读取文件内容,可以自动识别文件编码
///
///
///
public static string ReadAllText(string path)
{
if (System.IO.File.Exists(path))
{
try
{
return System.IO.File.ReadAllText(path, ryCommon.TxtFileEncoder.GetEncoding(path));
}
catch { return ""; }
}
return "";
}
///
/// 读取文件所有行,可以自动识别文件编码
///
///
///
public static string[] ReadAllLines(string path)
{
if (System.IO.File.Exists(path))
{
return System.IO.File.ReadAllLines(path, ryCommon.TxtFileEncoder.GetEncoding(path));
}
return null;
}
//static void ReadFile(string path,FileAccess fileAccess, FileShare fileShare)
//{
// FileStream fs = new FileStream(path, FileMode.Open, fileAccess, fileShare);
// var buffer = new byte[fs.Length];
// fs.Position = 0;
// fs.Read(buffer, 0, buffer.Length);
// Console.WriteLine(Encoding.Default.GetString(buffer));
//}
///
/// 写入所有文本行到文件,如果文件夹不存在,会自动创建
///
///
///
///
public static void WriteAllLines(string path,string[] content,Encoding encoding)
{
if (!System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(path)))
{
System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(path));
}
System.IO.File.WriteAllLines(path, content, encoding);
}
///
/// 写入所有文本到文件,如果文件夹不存在,会自动创建
///
///
///
///
public static void WriteAllText(string path, string content, Encoding encoding)
{
if (!System.IO.Directory.Exists(System.IO.Path.GetDirectoryName(path)))
{
System.IO.Directory.CreateDirectory(System.IO.Path.GetDirectoryName(path));
}
System.IO.File.WriteAllText(path, content, encoding);
}
///
/// 从文件中加载图片,使用本方法,不会导致图片文件被占用。
///
///
public static Image LoadPicFromFile(string path)
{
if(!System.IO.File.Exists(path))
{ return null; }
try
{
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
//把文件读取到字节数组
byte[] data = new byte[fs.Length];
fs.Read(data, 0, data.Length);
fs.Close();
//实例化一个内存流--->把从文件流中读取的内容[字节数组]放到内存流中去
MemoryStream ms = new MemoryStream(data);
//设置图片框 pictureBox1中的图片
return Image.FromStream(ms);
}
catch { return null; }
}
///
/// 获取文件大小
///
///
///
public static Int64 GetFileSize(string path)
{
try
{
FileInfo fileInfo = new FileInfo(path);
return fileInfo.Length;
}
catch { return -1; }
}
///
/// 添加文件到指定文件夹,会进行自动重命名,并返回重命名后的文件名(含路径)
///
/// 要添加的文件路径
/// 要添加到的文件夹
/// 是否根据时间进行重命名
/// 返回是否成功执行
/// 成功执行则返回路径,否则返回空
public static string AddFileToFolder(string filepath,string toFolder,bool RenameByTime, out bool OK)
{
OK = false;
var _toFolder = toFolder.TrimEnd('\\');
CreateDirectory(_toFolder);
if (!System.IO.Directory.Exists(_toFolder)) { return ""; }
if (!System.IO.File.Exists(filepath) && !System.IO.Directory.Exists(filepath)) { return ""; }
var filename = System.IO.Path.GetFileName(filepath);
if (RenameByTime) { filename = DateTime.Now.ToString("yyyyMMddHHmmss") + System.IO.Path.GetExtension(filepath); }
if(!System.IO.File.Exists(_toFolder+"\\"+ filename) && !System.IO.Directory.Exists(_toFolder + "\\" + filename)) {
string errorMsg = "";
if (ToMoveOrCopy(WFunc.FO_COPY, filepath, _toFolder + "\\" + filename, false, false, false, ref errorMsg) == 0)
{
OK = true;
return _toFolder + "\\" + filename;
}
return "";//如果复制失败,则返回空路径
}
else //如果目标路径已经存在同名文件
{
int index = 0;
string filename_noext;
if (RenameByTime) { filename_noext = DateTime.Now.ToString("yyyyMMddHHmmss"); }
else { filename_noext = System.IO.Path.GetFileNameWithoutExtension(filepath); }
var ext= System.IO.Path.GetExtension(filepath);
while (index<20) //最多重试20次
{
Random rd = new Random(Guid.NewGuid().GetHashCode());
if (RenameByTime) { filename_noext = DateTime.Now.ToString("yyyyMMddHHmmss"); }
var to_path = _toFolder + "\\" + filename_noext+"_"+ rd.Next(1000, 9999)+ ext;
if(!System.IO.File.Exists(to_path) && !System.IO.Directory.Exists(to_path))
{
string errorMsg = "";
if (ToMoveOrCopy(WFunc.FO_COPY, filepath, to_path, false, false, false, ref errorMsg) == 0)
{
OK = true;
return to_path;
}
return "";
}
index++;
}
return "";
}
}
///
/// 获取文件大小字符串
///
///
///
public static string GetFileSizeStr(long size)
{
if (size == -1) { return "未知"; }
string s = "";
string[] u = new string[] { "B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB", "NB", "DB" };
double i = size;
int n = 0;
while (i > 1024)
{
i = i / 1024.0;
n++;
if (n == 4) break;
}
s = i.ToString("F2") + u[n];
return s;
}
///
/// 获取文件大小字符串
///
///
///
public static string GetFileSizeStr(string filepath)
{
return GetFileSizeStr(GetFileSize(filepath));
}
///
/// 复制内容到剪切板
///
///
public static void CopyToClip(string text)
{
try
{
Clipboard.Clear();
Clipboard.SetText(text);
}
catch { }
}
private static ImageCodecInfo GetEncoderInfo(String mimeType)
{
int j;
ImageCodecInfo[] encoders = ImageCodecInfo.GetImageEncoders();
for (j = 0; j < encoders.Length; ++j)
{
if (encoders[j].MimeType == mimeType)
return encoders[j];
}
return null;
}
private static ImageCodecInfo GetEncoderInfo(ryCommon.sType.ImageType type)
{
#region 图片格式
ImageCodecInfo myImageCodecInfo;
string type_str = "image/jpeg";
switch (type)
{
case sType.ImageType.Bmp:
type_str = "image/bmp";
break;
case sType.ImageType.Jpeg:
type_str = "image/jpeg";
break;
case sType.ImageType.Gif:
type_str = "image/gif";
break;
case sType.ImageType.Tiff:
type_str = "image/tiff";
break;
case sType.ImageType.Png:
type_str = "image/png";
break;
}
myImageCodecInfo = GetEncoderInfo(type_str);
#endregion
return myImageCodecInfo;
}
private static EncoderParameters GetEncoderParameters(ryCommon.sType.ImageType type)
{
System.Drawing.Imaging.Encoder myEncoder;
EncoderParameter myEncoderParameter;
EncoderParameters myEncoderParameters;
myEncoder = System.Drawing.Imaging.Encoder.Quality;
myEncoderParameters = new EncoderParameters(1);
// Save the bitmap as a JPEG file with quality level 100.
myEncoderParameter = new EncoderParameter(myEncoder, 100L);
myEncoderParameters.Param[0] = myEncoderParameter;
return myEncoderParameters;
}
///
/// 添加某个控件为支持拖放属性
///
///
///
public static ElevatedDragDropManager AddDropDrag(IntPtr handle)
{
ElevatedDragDropManager.Instance.EnableDragDrop(handle);
return ElevatedDragDropManager.Instance;
}
///
/// 使管理员方式运行时支持拖放
///
///
///
public static void AdminDragEnable(IntPtr handle)
{
ElevatedDragDropManager.AdminDragEnable(handle);
}
///
/// 保存高质量不失真照片
///
///
///
///
public static void SaveHighQualityImage(Bitmap m,string path,ryCommon.sType.ImageType type)
{
m.Save(path, GetEncoderInfo(type), GetEncoderParameters(type));
}
///
/// 保存高质量不失真照片
///
///
///
///
public static void SaveHighQualityImage(Bitmap m, MemoryStream ms, ryCommon.sType.ImageType type)
{
m.Save(ms, GetEncoderInfo(type), GetEncoderParameters(type));
}
///
/// 保存高质量不失真照片
///
///
///
///
public static void SaveHighQualityImage(Image m, string path, ryCommon.sType.ImageType type)
{
m.Save(path, GetEncoderInfo(type), GetEncoderParameters(type));
}
///
/// 获取绝对路径
///
///
///
public static string GetRealPath(string _path)
{
string _tmp_path = _path.Replace("", Application.StartupPath);
_tmp_path = _tmp_path.Replace("", Environment.GetFolderPath(Environment.SpecialFolder.System));
_tmp_path = _tmp_path.Replace("", Environment.GetFolderPath(Environment.SpecialFolder.SystemX86));
_tmp_path = _tmp_path.Replace("", Environment.GetEnvironmentVariable("ProgramW6432"));
_tmp_path = _tmp_path.Replace("", Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86));
_tmp_path = _tmp_path.Replace("", Environment.GetFolderPath(Environment.SpecialFolder.Windows));
_tmp_path = _tmp_path.Replace("", Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));
_tmp_path = _tmp_path.Replace("", Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory));
_tmp_path = _tmp_path.Replace("", Environment.GetFolderPath(Environment.SpecialFolder.Fonts));
_tmp_path = Environment.ExpandEnvironmentVariables(_tmp_path);
if(_tmp_path.IndexOf("%")>=0)
{
foreach (int i in Enum.GetValues(typeof(Environment.SpecialFolder)))
{
string value = Environment.GetFolderPath((Environment.SpecialFolder)i);
string key= Enum.GetName(typeof(Environment.SpecialFolder), i);
if (_tmp_path.IndexOfEx(key) >= 0)
{
_tmp_path = _tmp_path.ReplaceEx("%"+key+"%", value);
}
}
}
_tmp_path = _tmp_path.Replace("\\\\", "\\");
return _tmp_path;
}
///
/// 获取相对路径
///
///
///
public static string GetRelativePath(string _path)
{
string _tmp_path = _path.Replace(Application.StartupPath, "");
_tmp_path = _tmp_path.Replace(Environment.GetFolderPath(Environment.SpecialFolder.System), "");
_tmp_path = _tmp_path.Replace(Environment.GetFolderPath(Environment.SpecialFolder.SystemX86), "");
_tmp_path = _tmp_path.Replace(Environment.GetEnvironmentVariable("ProgramW6432"), "");
_tmp_path = _tmp_path.Replace(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), "");
_tmp_path = _tmp_path.Replace(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "");
_tmp_path = _tmp_path.Replace(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "");
_tmp_path = _tmp_path.Replace(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "");
_tmp_path = _tmp_path.Replace(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "");
string wait_replace_value = "";
string wait_replace_key = "";
int max_length = 0;
foreach (int i in Enum.GetValues(typeof(Environment.SpecialFolder)))
{
string value = Environment.GetFolderPath((Environment.SpecialFolder)i);
if (value == "x86") { continue; }
if (_tmp_path.IndexOfEx(value) >= 0)
{
if (value.Length > max_length)
{
wait_replace_value = value;
wait_replace_key = Enum.GetName(typeof(Environment.SpecialFolder), i); ;
max_length = value.Length;
}
}
}
if (max_length > 0)
{
_tmp_path = _tmp_path.ReplaceEx(wait_replace_value, "%" + wait_replace_key + "%");
}
max_length = 0;
foreach (DictionaryEntry de in Environment.GetEnvironmentVariables())
{
string value = de.Value.ToString();
if (value == "x86") { continue; }
if (value.IndexOfEx(":")<0) { continue; }
if (_tmp_path.IndexOfEx(value) >= 0 && !value.IsInt())
{
if (value.Length > max_length)
{
wait_replace_value = value;
wait_replace_key = de.Key.ToString();
max_length = value.Length;
}
}
}
if (max_length>0)
{
_tmp_path = _tmp_path.ReplaceEx(wait_replace_value, "%" + wait_replace_key + "%");
}
return _tmp_path;
}
///
/// 获取图标
///
///
///
///
///
///
///
///
///
///
[DllImport("User32.dll")]
public static extern int PrivateExtractIcons(
string lpszFile, //file name
int nIconIndex, //The zero-based index of the first icon to extract.
int cxIcon, //The horizontal icon size wanted.
int cyIcon, //The vertical icon size wanted.
IntPtr[] phicon, //(out) A pointer to the returned array of icon handles.
int[] piconid, //(out) A pointer to a returned resource identifier.
int nIcons, //The number of icons to extract from the file. Only valid when *.exe and *.dll
int flags //Specifies flags that control this function.
);
///
/// 销毁图标
///
///
///
[DllImport("User32.dll")]
public static extern bool DestroyIcon(
IntPtr hIcon //A handle to the icon to be destroyed. The icon must not be in use.
);
///
/// 获取文件图标
///
///
///
///
///
///
public static Bitmap GetFileIcon(string _path,int index,out int count,int size)
{
var file = _path;
//选中文件中的图标总数
var iconTotalCount = PrivateExtractIcons(file, 0, 0, 0, null, null, 0, 0);
//用于接收获取到的图标指针
IntPtr[] hIcons = new IntPtr[iconTotalCount];
//对应的图标id
int[] ids = new int[iconTotalCount];
//成功获取到的图标个数
var successCount = PrivateExtractIcons(file, 0, size, size, hIcons, ids, iconTotalCount, 0);
count = successCount;
Bitmap bmp = null;
if(index>=0 && index< successCount)
{
if (hIcons[index] == IntPtr.Zero) { bmp = null; }
else
{
bmp = Icon.FromHandle(hIcons[index]).ToBitmap();
}
//内存回收
for (var i = 0; i < successCount; i++)
{
//指针为空,跳过
if (hIcons[i] == IntPtr.Zero) continue;
//内存回收
DestroyIcon(hIcons[i]);
}
}
return bmp;
}
}
}