吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2100|回复: 16
收起左侧

[学习记录] C# 学习笔记 命令行复制文件和目录

[复制链接]
Cool_Breeze 发表于 2021-3-9 19:31
本帖最后由 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


image.png image.png

一段小代码演示:
[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)

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
sunning-H-C + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

JimmyTiger 发表于 2021-3-9 19:39
用什么工具学啊
 楼主| Cool_Breeze 发表于 2021-3-9 19:43

看视频啊! 然后写代码查看官方文档API。 再然后上在论坛上发帖解决,百度也查不到的问题!
 楼主| Cool_Breeze 发表于 2021-3-9 19:53

老哥,你工作找到了吗? 你还有心思逛论坛吗?
JimmyTiger 发表于 2021-3-9 20:10
Cool_Breeze 发表于 2021-3-9 19:53
老哥,你工作找到了吗? 你还有心思逛论坛吗?

谢谢关心,找到了,哈哈
麦米尔加弗德 发表于 2021-3-9 20:34
问问vs软件安装要多大
微光丶少年时 发表于 2021-3-9 20:47
老哥看的什么视频
 楼主| Cool_Breeze 发表于 2021-3-9 20:52

https://www.bilibili.com/video/BV13b411b7Ht?p=22
B站,讲的很详细。
 楼主| Cool_Breeze 发表于 2021-3-9 20:53
麦米尔加弗德 发表于 2021-3-9 20:34
问问vs软件安装要多大

具体不是很清楚,得看你装的环境多还是少!
微光丶少年时 发表于 2021-3-9 21:05
Cool_Breeze 发表于 2021-3-9 20:52
https://www.bilibili.com/video/BV13b411b7Ht?p=22
B站,讲的很详细。

谢谢兄弟,我也刚学
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-17 00:51

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表