本帖最后由 Cool_Breeze 于 2021-3-9 23:42 编辑
[C#] 纯文本查看 复制代码 using System;
using System.IO;
using System.Collections.Generic;
using Microsoft.VisualBasic.FileIO;
class CopyFileExercise
{
static void Main (string[] args)
{
ConmandLineEventArgs Margs = new ConmandLineEventArgs(args); // 参数实例
ConmandLineParse clp = new ConmandLineParse(); // 解析命令行
clp.Parse(Margs);
new CopyDirectoryOrFile(Margs).Copy(); // 复制文件
}
// 储存参数数据
public class ConmandLineEventArgs : EventArgs
{
public readonly string sourceMatch = "-source:"; // 只读字段
public readonly string destinationMatch = "-destination:";
public string[] Args;
public string source{ get; set;} // 主要储存数据字段
public string destination{ get; set;} // 主要储存数据字段
public string Error;
public ConmandLineEventArgs(string[] args)
{
this.Args = args;
}
}
static void CLParseEventHandler(object sender, ConmandLineEventArgs e)
{
Console.WriteLine(e.Error);
Console.WriteLine("参数用法:\n\n\t{0}源文件名(或者源目录名)\n\t{1}新文件名(或者新目录名)", e.source, e.destination);
Environment.Exit(1); // 退出进程
}
// 命令行解析
class ConmandLineParse
{
public ConmandLineParse()
{
this.ErrorEvent += CLParseEventHandler; // 默认订阅事件处理器
}
public event EventHandler<ConmandLineEventArgs> ErrorEvent; // 错误事件
public void Parse(ConmandLineEventArgs e)
{
if (e.Args.Length != 2) // 检查参数数量
{
e.Error = "输入参数数量错误";
this.OnErrorEvent(e);
}
foreach (var n in e.Args) // 分析参数
{
if (n.StartsWith(e.sourceMatch))
{
e.source = n.Replace (e.sourceMatch, ""); // 源数据
}
else if (n.StartsWith(e.destinationMatch))
{
e.destination = n.Replace (e.destinationMatch, ""); // 目标数据
}
}
// 检查数据是否为空
if (e.source == "")
{
e.Error = "source为空";
this.OnErrorEvent(e);
}
if (e.destination == "")
{
e.Error = "destination为空";
this.OnErrorEvent(e);
}
}
private void OnErrorEvent(ConmandLineEventArgs e) // 参数不正确事件触发
{
this.ErrorEvent(this, e);
}
}
// 文件或者目录复制
public class CopyDirectoryOrFile
{
private ConmandLineEventArgs e;
private event EventHandler<ConmandLineEventArgs> ErrorEvent; // 事件
public CopyDirectoryOrFile(ConmandLineEventArgs e)
{
this.e = e;
this.ErrorEvent += CLParseEventHandler; // 事件订阅
}
public void Copy()
{
// 调用不同的复制方法
try
{
if (File.Exists(this.e.source))
{
FileSystem.CopyFile(this.e.source, this.e.destination, UIOption.AllDialogs, UICancelOption.DoNothing); // 用户取消不引发异常
}
else if (Directory.Exists(this.e.source))
{
FileSystem.CopyDirectory(this.e.source, this.e.destination, UIOption.AllDialogs, UICancelOption.DoNothing);
}
else
{
this.e.Error = String.Format("{0} 既不是文件也不是目录", e.source);
ErrorEvent(this, this.e);
}
}
catch (IOException E)
{
this.e.Error = E.Message; // 获取异常的信息
ErrorEvent(this, this.e);
}
}
}
}
Bat代码:
[Bash shell] 纯文本查看 复制代码 @echo off
REM 例子
REM CopyFile.exe -source:"D:\GIN\py" -destination:"D:\1 3"
CopyFile.exe -source:"D:\GIN\py\tianqi\dataTest.txt" -destination:"D:\1.txt"
REM CopyFile.exe -source:"D:\GIN\py\tianqi\dataTest.txt" -destination:"D:\1 3"
REM CopyFile.exe -source:"visualbasic.rar" -destination:"D:\1 3"
echo %errorlevel%
pause
一段小代码演示:
[Bash shell] 纯文本查看 复制代码 @echo off
echo;
echo ##############################
echo ## 穿越火线和英雄联盟备份 ###
echo ##############################
echo;
echo 输入 ^<Q^> 退出
echo 输入 ^<L^> 备份英雄联盟
echo 输入 ^<C^> 备份穿越火线
echo 输入 ^<T^> 备份穿越火线和英雄联盟
echo;
echo 请输入字母不区分大小写:
choice /c QLCT /n
set result=%errorlevel%
if %result% equ 1 exit
if %result% equ 2 call :BackupLOL
if %result% equ 3 call :BackupCF
if %result% equ 4 call :BackupTotal
pause
exit 0
:BackupLOL
CopyFile.exe -source:"C:\user\英雄联盟" -destination:"D:\腾讯游戏\英雄联盟"
exit /b
:BackupCF
CopyFile.exe -source:"C:\user\穿越火线" -destination:"D:\腾讯游戏\穿越火线"
exit /b
:BackupTotal
call :BackupLOL
call :BackupCF
exit /b
CopyFile.rar
(3.29 KB, 下载次数: 2)
|