### 2022-05-26更新

------
#### MyDbV4    V3.0.2205.2601
- *.[新增]新增BigFileOp类,支持对大文件和批量文件操作处理。
- *.[改进]RyFiles类的部分函数更换为BigFileOp类底层操作。
This commit is contained in:
鑫Intel 2022-05-26 17:12:39 +08:00
parent f7c882194c
commit b4830786a0
39 changed files with 700 additions and 114 deletions

View File

@ -1614,6 +1614,88 @@
</summary>
<returns></returns>
</member>
<member name="T:ryCommon.BigFileOp">
<summary>
大文件与批量文件操作类,支持中途取消操作,本类需要实例化操作
</summary>
</member>
<member name="T:ryCommon.BigFileOp.TranProgressHandler">
<summary>
传输进度
</summary>
<param name="curValue">当前传输完成的值</param>
<param name="totalValue">全部值,为-1表示无法获取</param>
<param name="percent">当前传输的百分比,为-1表示无法获取</param>
</member>
<member name="E:ryCommon.BigFileOp.OnProgress">
<summary>
传输进度
</summary>
</member>
<member name="E:ryCommon.BigFileOp.OnCanel">
<summary>
取消事件
</summary>
</member>
<member name="M:ryCommon.BigFileOp.CopyBigFile(System.String,System.String)">
<summary>
大文件按流复制文件,支持自动创建目标文件夹。 true复制成功 false复制失败
</summary>
<param name="soucrePath">原始文件路径</param>
<param name="targetPath">复制目标文件路径</param>
<returns></returns>
</member>
<member name="M:ryCommon.BigFileOp.CopyFolder(System.String,System.String)">
<summary>
复制文件夹到目标文件夹,不支持进度事件,支持中途取消
</summary>
<param name="fromDir">源文件夹</param>
<param name="ToDir">目标文件夹</param>
<returns>返回复制操作是否成功的标识成功返回0负数表示复制失败的文件数量。1表示源文件夹不存在</returns>
</member>
<member name="M:ryCommon.BigFileOp.CopyFolderByProgress(System.String,System.String)">
<summary>
复制文件夹到目标文件夹,支持进度事件,支持中途取消
</summary>
<param name="fromDir">源文件夹</param>
<param name="ToDir">目标文件夹</param>
<returns>返回复制操作是否成功的标识成功返回0负数表示复制失败的文件数量。1表示源文件夹不存在</returns>
</member>
<member name="M:ryCommon.BigFileOp.CopyFolder(System.String,System.String,System.Int32,System.Int32,System.Int32@)">
<summary>
复制文件夹到目标文件夹,支持中途取消
</summary>
<param name="fromDir">源文件夹</param>
<param name="ToDir">目标文件夹</param>
<param name="StartCount">初始的文件数量</param>
<param name="TotalCount">总数量,如果不计算,则使用-1</param>
<param name="Count">操作的数量,包含成功的和失败的</param>
<returns>返回复制操作是否成功的标识成功返回0负数表示复制失败的文件数量。1表示源文件夹不存在</returns>
</member>
<member name="M:ryCommon.BigFileOp.GetFilesCount(System.String)">
<summary>
获取文件夹中的文件数量
</summary>
<param name="Dir">文件夹路径</param>
<returns>返回文件数量,中途取消则返回-1</returns>
</member>
<member name="M:ryCommon.BigFileOp.GetFolderSize(System.String)">
<summary>
获取文件夹的大小
</summary>
<param name="Dir">文件夹路径</param>
<returns>返回文件数量,中途取消则返回-1</returns>
</member>
<member name="M:ryCommon.BigFileOp.AddFileToFolder(System.String,System.String,System.Boolean,System.Boolean@)">
<summary>
添加文件到指定文件夹,会进行自动重命名,并返回重命名后的文件名(含路径)
</summary>
<param name="filepath">要添加的文件路径</param>
<param name="toFolder">要添加到的文件夹</param>
<param name="RenameByTime">是否根据时间进行重命名</param>
<param name="OK">返回是否成功执行</param>
<returns>成功执行则返回路径,否则返回空</returns>
</member>
<member name="T:ryCommon.Hosts">
<summary>
Hosts操作类
@ -1992,11 +2074,11 @@
</member>
<member name="M:ryCommon.RyFiles.CopyFolder(System.String,System.String)">
<summary>
复制文件夹到目标文件夹
复制文件夹到目标文件夹(从3.0.2205.2601版本起已更换实现底层)
</summary>
<param name="fromDir">源文件夹</param>
<param name="ToDir">目标文件夹</param>
<returns>返回移动操作是否成功的标识成功返回0负数表示复制失败的文件数量。1表示源文件夹不存在</returns>
<returns>返回复制操作是否成功的标识成功返回0负数表示复制失败的文件数量。1表示源文件夹不存在</returns>
</member>
<member name="M:ryCommon.RyFiles.ReNameFile(System.String,System.String,System.Boolean,System.String@)">
<summary>

View File

@ -8697,6 +8697,11 @@
标题栏图标尺寸
</summary>
</member>
<member name="P:MGdu.WinFormUI.GMForm.GMFormIcon">
<summary>
窗体图标,如果设置本项,将不使用Icon属性
</summary>
</member>
<member name="P:MGdu.WinFormUI.GMForm.IconLeftMargin">
<summary>
标题栏图标与窗体左边框的距离

View File

@ -1614,6 +1614,88 @@
</summary>
<returns></returns>
</member>
<member name="T:ryCommon.BigFileOp">
<summary>
大文件与批量文件操作类,支持中途取消操作,本类需要实例化操作
</summary>
</member>
<member name="T:ryCommon.BigFileOp.TranProgressHandler">
<summary>
传输进度
</summary>
<param name="curValue">当前传输完成的值</param>
<param name="totalValue">全部值,为-1表示无法获取</param>
<param name="percent">当前传输的百分比,为-1表示无法获取</param>
</member>
<member name="E:ryCommon.BigFileOp.OnProgress">
<summary>
传输进度
</summary>
</member>
<member name="E:ryCommon.BigFileOp.OnCanel">
<summary>
取消事件
</summary>
</member>
<member name="M:ryCommon.BigFileOp.CopyBigFile(System.String,System.String)">
<summary>
大文件按流复制文件,支持自动创建目标文件夹。 true复制成功 false复制失败
</summary>
<param name="soucrePath">原始文件路径</param>
<param name="targetPath">复制目标文件路径</param>
<returns></returns>
</member>
<member name="M:ryCommon.BigFileOp.CopyFolder(System.String,System.String)">
<summary>
复制文件夹到目标文件夹,不支持进度事件,支持中途取消
</summary>
<param name="fromDir">源文件夹</param>
<param name="ToDir">目标文件夹</param>
<returns>返回复制操作是否成功的标识成功返回0负数表示复制失败的文件数量。1表示源文件夹不存在</returns>
</member>
<member name="M:ryCommon.BigFileOp.CopyFolderByProgress(System.String,System.String)">
<summary>
复制文件夹到目标文件夹,支持进度事件,支持中途取消
</summary>
<param name="fromDir">源文件夹</param>
<param name="ToDir">目标文件夹</param>
<returns>返回复制操作是否成功的标识成功返回0负数表示复制失败的文件数量。1表示源文件夹不存在</returns>
</member>
<member name="M:ryCommon.BigFileOp.CopyFolder(System.String,System.String,System.Int32,System.Int32,System.Int32@)">
<summary>
复制文件夹到目标文件夹,支持中途取消
</summary>
<param name="fromDir">源文件夹</param>
<param name="ToDir">目标文件夹</param>
<param name="StartCount">初始的文件数量</param>
<param name="TotalCount">总数量,如果不计算,则使用-1</param>
<param name="Count">操作的数量,包含成功的和失败的</param>
<returns>返回复制操作是否成功的标识成功返回0负数表示复制失败的文件数量。1表示源文件夹不存在</returns>
</member>
<member name="M:ryCommon.BigFileOp.GetFilesCount(System.String)">
<summary>
获取文件夹中的文件数量
</summary>
<param name="Dir">文件夹路径</param>
<returns>返回文件数量,中途取消则返回-1</returns>
</member>
<member name="M:ryCommon.BigFileOp.GetFolderSize(System.String)">
<summary>
获取文件夹的大小
</summary>
<param name="Dir">文件夹路径</param>
<returns>返回文件数量,中途取消则返回-1</returns>
</member>
<member name="M:ryCommon.BigFileOp.AddFileToFolder(System.String,System.String,System.Boolean,System.Boolean@)">
<summary>
添加文件到指定文件夹,会进行自动重命名,并返回重命名后的文件名(含路径)
</summary>
<param name="filepath">要添加的文件路径</param>
<param name="toFolder">要添加到的文件夹</param>
<param name="RenameByTime">是否根据时间进行重命名</param>
<param name="OK">返回是否成功执行</param>
<returns>成功执行则返回路径,否则返回空</returns>
</member>
<member name="T:ryCommon.Hosts">
<summary>
Hosts操作类
@ -1992,11 +2074,11 @@
</member>
<member name="M:ryCommon.RyFiles.CopyFolder(System.String,System.String)">
<summary>
复制文件夹到目标文件夹
复制文件夹到目标文件夹(从3.0.2205.2601版本起已更换实现底层)
</summary>
<param name="fromDir">源文件夹</param>
<param name="ToDir">目标文件夹</param>
<returns>返回移动操作是否成功的标识成功返回0负数表示复制失败的文件数量。1表示源文件夹不存在</returns>
<returns>返回复制操作是否成功的标识成功返回0负数表示复制失败的文件数量。1表示源文件夹不存在</returns>
</member>
<member name="M:ryCommon.RyFiles.ReNameFile(System.String,System.String,System.Boolean,System.String@)">
<summary>

View File

@ -8697,6 +8697,11 @@
标题栏图标尺寸
</summary>
</member>
<member name="P:MGdu.WinFormUI.GMForm.GMFormIcon">
<summary>
窗体图标,如果设置本项,将不使用Icon属性
</summary>
</member>
<member name="P:MGdu.WinFormUI.GMForm.IconLeftMargin">
<summary>
标题栏图标与窗体左边框的距离

View File

@ -1614,6 +1614,88 @@
</summary>
<returns></returns>
</member>
<member name="T:ryCommon.BigFileOp">
<summary>
大文件与批量文件操作类,支持中途取消操作,本类需要实例化操作
</summary>
</member>
<member name="T:ryCommon.BigFileOp.TranProgressHandler">
<summary>
传输进度
</summary>
<param name="curValue">当前传输完成的值</param>
<param name="totalValue">全部值,为-1表示无法获取</param>
<param name="percent">当前传输的百分比,为-1表示无法获取</param>
</member>
<member name="E:ryCommon.BigFileOp.OnProgress">
<summary>
传输进度
</summary>
</member>
<member name="E:ryCommon.BigFileOp.OnCanel">
<summary>
取消事件
</summary>
</member>
<member name="M:ryCommon.BigFileOp.CopyBigFile(System.String,System.String)">
<summary>
大文件按流复制文件,支持自动创建目标文件夹。 true复制成功 false复制失败
</summary>
<param name="soucrePath">原始文件路径</param>
<param name="targetPath">复制目标文件路径</param>
<returns></returns>
</member>
<member name="M:ryCommon.BigFileOp.CopyFolder(System.String,System.String)">
<summary>
复制文件夹到目标文件夹,不支持进度事件,支持中途取消
</summary>
<param name="fromDir">源文件夹</param>
<param name="ToDir">目标文件夹</param>
<returns>返回复制操作是否成功的标识成功返回0负数表示复制失败的文件数量。1表示源文件夹不存在</returns>
</member>
<member name="M:ryCommon.BigFileOp.CopyFolderByProgress(System.String,System.String)">
<summary>
复制文件夹到目标文件夹,支持进度事件,支持中途取消
</summary>
<param name="fromDir">源文件夹</param>
<param name="ToDir">目标文件夹</param>
<returns>返回复制操作是否成功的标识成功返回0负数表示复制失败的文件数量。1表示源文件夹不存在</returns>
</member>
<member name="M:ryCommon.BigFileOp.CopyFolder(System.String,System.String,System.Int32,System.Int32,System.Int32@)">
<summary>
复制文件夹到目标文件夹,支持中途取消
</summary>
<param name="fromDir">源文件夹</param>
<param name="ToDir">目标文件夹</param>
<param name="StartCount">初始的文件数量</param>
<param name="TotalCount">总数量,如果不计算,则使用-1</param>
<param name="Count">操作的数量,包含成功的和失败的</param>
<returns>返回复制操作是否成功的标识成功返回0负数表示复制失败的文件数量。1表示源文件夹不存在</returns>
</member>
<member name="M:ryCommon.BigFileOp.GetFilesCount(System.String)">
<summary>
获取文件夹中的文件数量
</summary>
<param name="Dir">文件夹路径</param>
<returns>返回文件数量,中途取消则返回-1</returns>
</member>
<member name="M:ryCommon.BigFileOp.GetFolderSize(System.String)">
<summary>
获取文件夹的大小
</summary>
<param name="Dir">文件夹路径</param>
<returns>返回文件数量,中途取消则返回-1</returns>
</member>
<member name="M:ryCommon.BigFileOp.AddFileToFolder(System.String,System.String,System.Boolean,System.Boolean@)">
<summary>
添加文件到指定文件夹,会进行自动重命名,并返回重命名后的文件名(含路径)
</summary>
<param name="filepath">要添加的文件路径</param>
<param name="toFolder">要添加到的文件夹</param>
<param name="RenameByTime">是否根据时间进行重命名</param>
<param name="OK">返回是否成功执行</param>
<returns>成功执行则返回路径,否则返回空</returns>
</member>
<member name="T:ryCommon.Hosts">
<summary>
Hosts操作类
@ -1992,11 +2074,11 @@
</member>
<member name="M:ryCommon.RyFiles.CopyFolder(System.String,System.String)">
<summary>
复制文件夹到目标文件夹
复制文件夹到目标文件夹(从3.0.2205.2601版本起已更换实现底层)
</summary>
<param name="fromDir">源文件夹</param>
<param name="ToDir">目标文件夹</param>
<returns>返回移动操作是否成功的标识成功返回0负数表示复制失败的文件数量。1表示源文件夹不存在</returns>
<returns>返回复制操作是否成功的标识成功返回0负数表示复制失败的文件数量。1表示源文件夹不存在</returns>
</member>
<member name="M:ryCommon.RyFiles.ReNameFile(System.String,System.String,System.Boolean,System.String@)">
<summary>

View File

@ -8697,6 +8697,11 @@
标题栏图标尺寸
</summary>
</member>
<member name="P:MGdu.WinFormUI.GMForm.GMFormIcon">
<summary>
窗体图标,如果设置本项,将不使用Icon属性
</summary>
</member>
<member name="P:MGdu.WinFormUI.GMForm.IconLeftMargin">
<summary>
标题栏图标与窗体左边框的距离

View File

@ -1614,6 +1614,88 @@
</summary>
<returns></returns>
</member>
<member name="T:ryCommon.BigFileOp">
<summary>
大文件与批量文件操作类,支持中途取消操作,本类需要实例化操作
</summary>
</member>
<member name="T:ryCommon.BigFileOp.TranProgressHandler">
<summary>
传输进度
</summary>
<param name="curValue">当前传输完成的值</param>
<param name="totalValue">全部值,为-1表示无法获取</param>
<param name="percent">当前传输的百分比,为-1表示无法获取</param>
</member>
<member name="E:ryCommon.BigFileOp.OnProgress">
<summary>
传输进度
</summary>
</member>
<member name="E:ryCommon.BigFileOp.OnCanel">
<summary>
取消事件
</summary>
</member>
<member name="M:ryCommon.BigFileOp.CopyBigFile(System.String,System.String)">
<summary>
大文件按流复制文件,支持自动创建目标文件夹。 true复制成功 false复制失败
</summary>
<param name="soucrePath">原始文件路径</param>
<param name="targetPath">复制目标文件路径</param>
<returns></returns>
</member>
<member name="M:ryCommon.BigFileOp.CopyFolder(System.String,System.String)">
<summary>
复制文件夹到目标文件夹,不支持进度事件,支持中途取消
</summary>
<param name="fromDir">源文件夹</param>
<param name="ToDir">目标文件夹</param>
<returns>返回复制操作是否成功的标识成功返回0负数表示复制失败的文件数量。1表示源文件夹不存在</returns>
</member>
<member name="M:ryCommon.BigFileOp.CopyFolderByProgress(System.String,System.String)">
<summary>
复制文件夹到目标文件夹,支持进度事件,支持中途取消
</summary>
<param name="fromDir">源文件夹</param>
<param name="ToDir">目标文件夹</param>
<returns>返回复制操作是否成功的标识成功返回0负数表示复制失败的文件数量。1表示源文件夹不存在</returns>
</member>
<member name="M:ryCommon.BigFileOp.CopyFolder(System.String,System.String,System.Int32,System.Int32,System.Int32@)">
<summary>
复制文件夹到目标文件夹,支持中途取消
</summary>
<param name="fromDir">源文件夹</param>
<param name="ToDir">目标文件夹</param>
<param name="StartCount">初始的文件数量</param>
<param name="TotalCount">总数量,如果不计算,则使用-1</param>
<param name="Count">操作的数量,包含成功的和失败的</param>
<returns>返回复制操作是否成功的标识成功返回0负数表示复制失败的文件数量。1表示源文件夹不存在</returns>
</member>
<member name="M:ryCommon.BigFileOp.GetFilesCount(System.String)">
<summary>
获取文件夹中的文件数量
</summary>
<param name="Dir">文件夹路径</param>
<returns>返回文件数量,中途取消则返回-1</returns>
</member>
<member name="M:ryCommon.BigFileOp.GetFolderSize(System.String)">
<summary>
获取文件夹的大小
</summary>
<param name="Dir">文件夹路径</param>
<returns>返回文件数量,中途取消则返回-1</returns>
</member>
<member name="M:ryCommon.BigFileOp.AddFileToFolder(System.String,System.String,System.Boolean,System.Boolean@)">
<summary>
添加文件到指定文件夹,会进行自动重命名,并返回重命名后的文件名(含路径)
</summary>
<param name="filepath">要添加的文件路径</param>
<param name="toFolder">要添加到的文件夹</param>
<param name="RenameByTime">是否根据时间进行重命名</param>
<param name="OK">返回是否成功执行</param>
<returns>成功执行则返回路径,否则返回空</returns>
</member>
<member name="T:ryCommon.Hosts">
<summary>
Hosts操作类
@ -1992,11 +2074,11 @@
</member>
<member name="M:ryCommon.RyFiles.CopyFolder(System.String,System.String)">
<summary>
复制文件夹到目标文件夹
复制文件夹到目标文件夹(从3.0.2205.2601版本起已更换实现底层)
</summary>
<param name="fromDir">源文件夹</param>
<param name="ToDir">目标文件夹</param>
<returns>返回移动操作是否成功的标识成功返回0负数表示复制失败的文件数量。1表示源文件夹不存在</returns>
<returns>返回复制操作是否成功的标识成功返回0负数表示复制失败的文件数量。1表示源文件夹不存在</returns>
</member>
<member name="M:ryCommon.RyFiles.ReNameFile(System.String,System.String,System.Boolean,System.String@)">
<summary>

View File

@ -8697,6 +8697,11 @@
标题栏图标尺寸
</summary>
</member>
<member name="P:MGdu.WinFormUI.GMForm.GMFormIcon">
<summary>
窗体图标,如果设置本项,将不使用Icon属性
</summary>
</member>
<member name="P:MGdu.WinFormUI.GMForm.IconLeftMargin">
<summary>
标题栏图标与窗体左边框的距离

View File

@ -1,4 +1,10 @@
### 2022-05-09更新
### 2022-05-26更新
------
#### MyDbV4 V3.0.2205.2601
- *.[新增]新增BigFileOp类,支持对大文件和批量文件操作处理。
- *.[改进]RyFiles类的部分函数更换为BigFileOp类底层操作。
### 2022-05-09更新
------
#### MyDbV4 V3.0.2205.0901
- *.[改进]RyForm类的Show函数针对窗体最小化或不在屏幕内的情况做出优化。

View File

@ -10,7 +10,7 @@ using System.Runtime.InteropServices;
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Itrycn_Project")]
[assembly: AssemblyCopyright("Copyright © 2021")]
[assembly: AssemblyCopyright("Copyright © 2022")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

View File

@ -0,0 +1,296 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Text;
namespace ryCommon
{
/// <summary>
/// 大文件与批量文件操作类,支持中途取消操作,本类需要实例化操作
/// </summary>
public class BigFileOp
{
/// <summary>
/// 传输进度
/// </summary>
/// <param name="curValue">当前传输完成的值</param>
/// <param name="totalValue">全部值,为-1表示无法获取</param>
/// <param name="percent">当前传输的百分比,为-1表示无法获取</param>
public delegate void TranProgressHandler(long curValue, long totalValue, double percent);
/// <summary>
/// 传输进度
/// </summary>
public static event TranProgressHandler OnProgress;
/// <summary>
/// 取消事件
/// </summary>
public static event CancelEventHandler OnCanel;
/// <summary>
/// 大文件按流复制文件,支持自动创建目标文件夹。 true复制成功 false复制失败
/// </summary>
/// <param name="soucrePath">原始文件路径</param>
/// <param name="targetPath">复制目标文件路径</param>
/// <returns></returns>
public bool CopyBigFile(string soucrePath, string targetPath)
{
try
{
var TranSize = 1024 * 1024 * 2;//每次读取2M
//读取复制文件流
using (FileStream fsRead = new FileStream(soucrePath, FileMode.Open, FileAccess.Read))
{
if (RyFiles.DeleteFile(targetPath) != 0)
{
return false;
}
RyFiles.CreateDirectory(System.IO.Path.GetDirectoryName(targetPath));
OnProgress?.Invoke(0, fsRead.Length, 0);
var totalSize = fsRead.Length;
//写入文件复制流
using (FileStream fsWrite = new FileStream(targetPath, FileMode.OpenOrCreate, FileAccess.Write))
{
byte[] buffer = new byte[TranSize];
var curSize = 0L;
CancelEventArgs e1 = new CancelEventArgs();
//可能文件比较大要循环读取每次读取2M
while (true)
{
if (OnCanel != null)
{
OnCanel?.Invoke(this, e1);
if (e1.Cancel) {
fsWrite.Close();
RyFiles.DeleteFile(targetPath);
break;
}
}
//每次读取的数据 n是每次读取到的实际数据大小
int n = fsRead.Read(buffer, 0, buffer.Count());
//如果n=0说明读取的数据为空已经读取到最后了跳出循环
if (n == 0)
{
break;
}
curSize += n;
OnProgress?.Invoke(curSize, totalSize, totalSize == 0 ? 0 : curSize / (double)totalSize);
//写入每次读取的实际数据大小
fsWrite.Write(buffer, 0, n);
}
}
OnProgress?.Invoke(totalSize, totalSize, 100);
if (!System.IO.File.Exists(targetPath))
{
return false;
}
}
return true;
}
catch
{
return false;
}
}
/// <summary>
/// 复制文件夹到目标文件夹,不支持进度事件,支持中途取消
/// </summary>
/// <param name="fromDir">源文件夹</param>
/// <param name="ToDir">目标文件夹</param>
/// <returns>返回复制操作是否成功的标识成功返回0负数表示复制失败的文件数量。1表示源文件夹不存在</returns>
public int CopyFolder(string fromDir, string ToDir)
{
return CopyFolder(fromDir,ToDir,0,-1,out _);
}
/// <summary>
/// 复制文件夹到目标文件夹,支持进度事件,支持中途取消
/// </summary>
/// <param name="fromDir">源文件夹</param>
/// <param name="ToDir">目标文件夹</param>
/// <returns>返回复制操作是否成功的标识成功返回0负数表示复制失败的文件数量。1表示源文件夹不存在</returns>
public int CopyFolderByProgress(string fromDir, string ToDir)
{
var FileCount = GetFilesCount(fromDir);
return CopyFolder(fromDir, ToDir, 0, FileCount, out _);
}
/// <summary>
/// 复制文件夹到目标文件夹,支持中途取消
/// </summary>
/// <param name="fromDir">源文件夹</param>
/// <param name="ToDir">目标文件夹</param>
/// <param name="StartCount">初始的文件数量</param>
/// <param name="TotalCount">总数量,如果不计算,则使用-1</param>
/// <param name="Count">操作的数量,包含成功的和失败的</param>
/// <returns>返回复制操作是否成功的标识成功返回0负数表示复制失败的文件数量。1表示源文件夹不存在</returns>
private int CopyFolder(string fromDir, string ToDir,int StartCount,int TotalCount, out int Count)
{
Count = StartCount;
var _fromDir = fromDir.TrimEnd('\\');
var _ToDir = ToDir.TrimEnd('\\');
if (!Directory.Exists(_fromDir)) { return 1; }
var files = Directory.GetFiles(fromDir);
var error = 0;
CancelEventArgs e1 = new CancelEventArgs();
foreach (var file in files)
{
if (OnCanel != null)
{
OnCanel?.Invoke(this, e1);
if (e1.Cancel) { break; }
}
if (!CopyBigFile(file, _ToDir + "\\" + Path.GetFileName(file)))
{
error++;
}
Count++;
var percent = 0d;
if (TotalCount>0) { percent = Count / (double)TotalCount; }
else if (TotalCount == -1) { percent = -1; }
OnProgress?.Invoke(Count, TotalCount, percent);
}
var dirs = Directory.GetDirectories(_fromDir);
foreach (var dir in dirs)
{
int result = CopyFolder(dir, _ToDir + "\\" + Path.GetFileName(dir), Count, TotalCount, out var _Count);
Count += _Count;
if (OnCanel != null)
{
OnCanel?.Invoke(this, e1);
if (e1.Cancel) { break; }
}
if (result > 0)
{
error++;
}
else if (result < 0)
{
error+=-result;
}
}
return -error;
}
/// <summary>
/// 获取文件夹中的文件数量
/// </summary>
/// <param name="Dir">文件夹路径</param>
/// <returns>返回文件数量,中途取消则返回-1</returns>
public int GetFilesCount(string Dir)
{
var _fromDir = Dir.TrimEnd('\\');
if (!Directory.Exists(_fromDir)) { return 0; }
var files = Directory.GetFiles(_fromDir);
var count = 0;
CancelEventArgs e1 = new CancelEventArgs();
count += files.Length;
var dirs = Directory.GetDirectories(_fromDir);
foreach (var dir in dirs)
{
if (OnCanel != null)
{
OnCanel?.Invoke(this, e1);
if (e1.Cancel) { count = -1; break; }
}
var result= GetFilesCount(dir);
if (result == -1) { count = -1;break; }
count+= result;
}
return count;
}
/// <summary>
/// 获取文件夹的大小
/// </summary>
/// <param name="Dir">文件夹路径</param>
/// <returns>返回文件数量,中途取消则返回-1</returns>
public long GetFolderSize(string Dir)
{
var _fromDir = Dir.TrimEnd('\\');
if (!Directory.Exists(_fromDir)) { return 0; }
var files = Directory.GetFiles(_fromDir);
var size = 0L;
CancelEventArgs e1 = new CancelEventArgs();
for (int i = 0; i < files.Length; i++)
{
if (OnCanel != null && i %5==0)
{
OnCanel?.Invoke(this, e1);
if (e1.Cancel) { size = -1; break; }
}
size +=RyFiles.GetFileSize(files[i]);
}
var dirs = Directory.GetDirectories(_fromDir);
foreach (var dir in dirs)
{
if (OnCanel != null)
{
OnCanel?.Invoke(this, e1);
if (e1.Cancel) { size = -1; break; }
}
var result = GetFilesCount(dir);
if (result == -1) { size = -1; break; }
size += result;
}
return size;
}
/// <summary>
/// 添加文件到指定文件夹,会进行自动重命名,并返回重命名后的文件名(含路径)
/// </summary>
/// <param name="filepath">要添加的文件路径</param>
/// <param name="toFolder">要添加到的文件夹</param>
/// <param name="RenameByTime">是否根据时间进行重命名</param>
/// <param name="OK">返回是否成功执行</param>
/// <returns>成功执行则返回路径,否则返回空</returns>
public string AddFileToFolder(string filepath, string toFolder, bool RenameByTime, out bool OK)
{
OK = false;
var _toFolder = toFolder.TrimEnd('\\');
RyFiles.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))
{
if (CopyBigFile(filepath, _toFolder + "\\" + filename))
{
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);
CancelEventArgs e1 = new CancelEventArgs();
while (index < 20) //最多重试20次
{
if (OnCanel != null)
{
OnCanel?.Invoke(this, e1);
if (e1.Cancel)
{
break;
}
}
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))
{
if (CopyBigFile(filepath, to_path))
{
OK = true;
return to_path;
}
return "";
}
index++;
}
return "";
}
}
}
}

View File

@ -1,6 +1,7 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
@ -16,6 +17,7 @@ namespace ryCommon
/// </summary>
public class RyFiles
{
private static BigFileOp file_op = new BigFileOp();
#region
private struct SHFILEOPSTRUCT
{
@ -285,6 +287,7 @@ namespace ryCommon
/// <param name="sourceFileName">要复制的文件名</param>
/// <param name="destinationFileName">复制到的目的文件名或路径</param>
/// <returns></returns>
[Obsolete("已过时,即将在将来移除该函数,请使用CopyBigFile代替")]
public static int CopyFile(string sourceFileName, string destinationFileName)
{
string errorMsg = "";
@ -353,66 +356,17 @@ namespace ryCommon
/// <returns></returns>
public static bool CopyBigFile(string soucrePath, string targetPath)
{
try
{
//读取复制文件流
using (FileStream fsRead = new FileStream(soucrePath, FileMode.Open, FileAccess.Read))
{
//写入文件复制流
using (FileStream fsWrite = new FileStream(targetPath, FileMode.OpenOrCreate, FileAccess.Write))
{
byte[] buffer = new byte[1024 * 1024 * 2]; //每次读取2M
//可能文件比较大要循环读取每次读取2M
while (true)
{
//每次读取的数据 n是每次读取到的实际数据大小
int n = fsRead.Read(buffer, 0, buffer.Count());
//如果n=0说明读取的数据为空已经读取到最后了跳出循环
if (n == 0)
{
break;
}
//写入每次读取的实际数据大小
fsWrite.Write(buffer, 0, n);
}
}
}
return true;
}
catch
{
return false;
}
return file_op.CopyBigFile(soucrePath, targetPath);
}
/// <summary>
/// 复制文件夹到目标文件夹
/// 复制文件夹到目标文件夹(从3.0.2205.2601版本起已更换实现底层)
/// </summary>
/// <param name="fromDir">源文件夹</param>
/// <param name="ToDir">目标文件夹</param>
/// <returns>返回移动操作是否成功的标识成功返回0负数表示复制失败的文件数量。1表示源文件夹不存在</returns>
/// <returns>返回复制操作是否成功的标识成功返回0负数表示复制失败的文件数量。1表示源文件夹不存在</returns>
public static int CopyFolder(string fromDir, string ToDir)
{
var _fromDir = fromDir.TrimEnd('\\');
var _ToDir=ToDir.TrimEnd('\\');
if (!Directory.Exists(_fromDir)) { return 1; }
var files = Directory.GetFiles(fromDir);
var error = 0;
foreach (var file in files)
{
if (CopyFile(file, _ToDir + "\\" + Path.GetFileName(file)) != 0)
{
error++;
}
}
var dirs = Directory.GetDirectories(_fromDir);
foreach (var dir in dirs)
{
if (CopyFolder(dir, _ToDir + "\\" + Path.GetFileName(dir)) > 0)
{
error++;
}
}
return -error;
return file_op.CopyFolder(fromDir, ToDir);
}
#endregion
@ -672,7 +626,7 @@ namespace ryCommon
}
}
[DllImport("Kernel32", CharSet = CharSet.Unicode)]
private static extern Int32 GetShortPathName(String path, StringBuilder shortPath, Int32 shortPathLength);
private static extern int GetShortPathName(String path, StringBuilder shortPath, Int32 shortPathLength);
/// <summary>
/// 打开文件夹并定位文件
/// </summary>
@ -830,10 +784,7 @@ namespace ryCommon
/// <param name="encoding"></param>
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));
}
CreateDirectory(System.IO.Path.GetDirectoryName(path));
System.IO.File.WriteAllText(path, content, encoding);
}
/// <summary>
@ -864,7 +815,7 @@ namespace ryCommon
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public static Int64 GetFileSize(string path)
public static long GetFileSize(string path)
{
try
{
@ -883,48 +834,7 @@ namespace ryCommon
/// <returns>成功执行则返回路径,否则返回空</returns>
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 "";
}
return file_op.AddFileToFolder(filepath, toFolder, RenameByTime,out OK);
}
/// <summary>
/// 获取文件大小字符串

View File

@ -75,6 +75,7 @@
<Compile Include="DbManage\VarExtension.cs" />
<Compile Include="FileFuns\ElevatedDragDropManager.cs" />
<Compile Include="FileFuns\FileInfo.cs" />
<Compile Include="FileFuns\BigFileOp.cs" />
<Compile Include="FileFuns\Hosts.cs" />
<Compile Include="FileFuns\SoundPlay.cs" />
<Compile Include="FileFuns\RyFiles.cs" />

View File

@ -32,5 +32,5 @@ using System;
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值,
// 方法是按如下所示使用“*”: :
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("3.0.2205.0901")]
[assembly: AssemblyFileVersion("3.0.2205.0901")]
[assembly: AssemblyVersion("3.0.2205.2601")]
[assembly: AssemblyFileVersion("3.0.2205.2601")]

View File

@ -337,6 +337,24 @@ namespace MGdu.WinFormUI
Invalidate();
}
}
private Image gmform_icon = null;
/// <summary>
/// 窗体图标,如果设置本项,将不使用Icon属性
/// </summary>
[Category("GMForm")]
[Description("窗体图标,如果设置本项,将不使用Icon属性")]
public Image GMFormIcon
{
get
{
return gmform_icon;
}
set
{
gmform_icon = value;
Invalidate();
}
}
/// <summary>
/// 标题栏图标与窗体左边框的距离
/// </summary>
@ -1124,7 +1142,14 @@ namespace MGdu.WinFormUI
{
if (ShowIcon && Icon != null && XTheme.DrawCaptionIcon)
{
g.DrawIcon(this.Icon, IconRect);
if (GMFormIcon == null)
{
g.DrawIcon(this.Icon, IconRect);
}
else
{
g.DrawImage(this.GMFormIcon, IconRect);
}
}
if (!string.IsNullOrEmpty(Text) && XTheme.DrawCaptionText)