精华内容
下载资源
问答
  • linux定时上传本地文件到ftp服务器shell脚本 由于项目需求,需要写一个shell脚本,上传本地文件到ftp服务器,并生成定时任务,每天都运行一次脚本,这脚本花了我2天时间…(组长对我说写不出来我帮你写…原谅我太渣...

    linux定时上传本地文件到ftp服务器shell脚本

    由于项目需求,需要写一个shell脚本,上传本地文件到ftp服务器,并生成定时任务,每天都运行一次脚本,这脚本花了我2天时间…(组长对我说写不出来我帮你写…原谅我太渣),第一次写shell脚本,记录一下。

    首先解释一下shell脚本:脚本文件其实就是把你在linux下敲击的命令都放在.sh脚本里面,然后去运行这个脚本,比如你要创建一个文件,然后压缩,然后删除源文件,用linux命令的话你需要一步一步敲击如下三个命令:
    touch test.txt
    zip /root/test.zip test.txt
    rm -f test.txt
    使用shell脚本的话,你只需要把这三个命令都放在脚本里,然后执行脚本,就不用一次一次敲击命令,方便很多。

    再啰嗦一下:一定要搞清楚自己的需求,随便去网上搜一个脚本的话大部分是无法满足自己的需求的,因为需求不一样(我就吃了这个亏),你可以多去看一下别人的脚本是如何写的,学习如何写脚本。

    我的项目需求:把本机上面的四个业务的日志文件,压缩成zip包,上传到ftp服务器,ftp目录结构要求:每个月的日志放在一个文件夹下,文件夹命名规则为:年月,如201902,然后每天的日志压缩包命名规则为:年月日_主机名,如20190227_hostname1.zip(解压后为20190227.log),结构如下:

    • live
      • 201902
        • 20190227
          • 20190227_hostname1.zip
          • 20190227_hostname2.zip
        • 20190228
          • 20190228_hostname1.zip
          • 20190228_hostname2.zip
      • 201903

    因为分布式部署,所以每天的日志压缩包名字加上主机名字。

    废话不多说,先抛出我这次上传文件用的shell脚本:

    #!/bin/bash
    #主机名
    hostname=$HOSTNAME 
    #本机log文件目录
    live_dir="/logs/live"
    
    #先 生成zip文件
    #因为本机的日志文件名字跟要上传到ftp服务器的文件名不一样 所以在此做一下转换
    oldfile=$(date -d "-1 day" +%Y-%m-%d)
    newfile=$(date -d "-1 day" +%Y%m%d)
    livefile=$newfile"_"$hostname
    
    #要求上传的文件为zip包,在此做压缩
    if [ -d $live_dir ];then
            cd $live_dir
            cp $oldfile.log $livefile.log
            zip $livefile.zip $livefile.log
            rm -rf $livefile.log
    fi
    
    #远程服务器目录按年月日生成目录,共有三级
    #一级目录:
    zhibodir=live
    #二级目录:201902
    seconddir=$(date -d "-1 day" +%Y%m)
    #三级目录:20190228
    thirddir=$(date -d "-1 day" +%Y%m%d)
    #连接ftp服务器
    ftp -v -n 132.128.202.203<<EOF
    user root 111111
    binary
    hash
    #判断服务器上的目录是否存在
    if [ ! -d $zhibodir];then
        mkdir $zhibodir
    fi
    cd $zhibodir
    if [ ! -d $seconddir];then
        mkdir $seconddir
    fi
    cd $seconddir
    if [ ! -d $thirddir];then
        mkdir $thirddir
    fi
    cd $thirddir
    #切换到本机log目录
    lcd $live_dir
    prompt off
    mput $livefile.zip
    close
    bye
    EOF      
    
    

    脚本就这么多,你要是用的话注意目录修改和服务器地址修改。我再说一遍,不要直接用,可以参照怎么写的,有问题可以留言。

    再多说一句:如果脚本执行报错ftp命令找不到之类的,注意以下问题(我遇到过):
    1、是不是用户没有操作ftp的权限
    2、服务器是否安转ftp客户端
    3、使用root用户操作的话,要看看root用户是否有操作ftp权限

    关于linux操作ftp的命令可以看:
    链接: linux下操作ftp的相关命令.

    展开全文
  • 采用SFTP定时扫描本地文件,同时判断本地文件是否传输完成,如果传输完成,则向服务器开始上传本地文件,.bat启动,包含配置文件等,已通过公司测试
  • 如何从linux批量下载/本地批量上传文件至linux服务器首先在windows安装WinSCP上传:编写bat脚本下载:编写bat脚本解释 首先在windows安装WinSCP 此处省略安装教程,可百度; 上传:编写bat脚本 //进入到winSCP的安装...

    定时任务:从linux批量下载/本地批量上传文件至linux服务器

    首先在windows安装WinSCP

    此处省略安装教程,可百度;
    

    上传:编写bat脚本

    //进入到winSCP的安装目录
    cd E:\WinSCP
    winscp.exe /console /command  "option batch continue"  "option confirm off" "open ftp://username:password@192.168.100.204"  "option transfer binary" "put G:\data_bak\down_mysql\*.tar.zar /backup/data/V2.0/"  "exit"
    

    下载:编写bat脚本

    //进入到winSCP的安装目录
    E:
    cd WinSCP
    winscp.exe /console /command  "option batch continue"  "option confirm off" "open sftp://root:JKIv2XIMYaWSnTxY@47.93.82.105"  "option transfer binary" "get /data_bak/*20210224*.sql G:\data_bak\V3\" "exit"
    

    注意1:如果是Linux服务器,得用sftp
    注意2:如果路径是文件夹,最后必须有,如G:\data_bak\down_mysql\,否则会把down_mysql当成文件名。

    解释

    winscp.exe /console /command    ::这个就是命令名,winscp.exe 按照实际安装的文件名写
    “option batch continue”     ::这个默认批处理
    “option confirm off” ::这个是避免提示
    ”open ftp://ftpuser1: XXXX@127.0.0.1 :21” ::这个是要访问的服务器,这里我访问本机上的ftp,使用用户名ftpuser1,密码XXXX ”
    "option transfer binary” ::这个使用二进制格式传送
    “put:\data_bak\mysql_shell\down_mysql*.tar.zar /backup/data/V2.0/” ::这个从本机文件夹中上传所有的txt文件,上传到服务器/backup/data/V2.0文件夹中,注意这些内容放在一个参数中 “exit” ::执行完命令后退出

    windows添加定时任务

    1.win+r快捷键
    2.输入compmgmt.msc,点击确定
    在这里插入图片描述
    3.创建定时任务创建定时任务
    4.选择创建好的脚本在这里插入图片描述
    5.再选择触发器选择执行时间即可
    在这里插入图片描述

    展开全文
  • 该项目主要是实现将本地文件上传到FTP服务器中,主要有以下功能: 1、可以定时自动上传也可以手动上传 2、通过XML文件可以配置FTP服务器信息 3、自动上传时需要配置上传文件所在本地的文件夹,也通过XML进行配置 4、...
  • 解决思路:在A服务器中注册一个Windows服务,通过Timer来控制定期执行,读取A服务器本地文件夹及文件通过FTP的方式上传到B服务器对应的文件夹中。 以下代码是做了一个服务注册工具 效果如下图: 实现代码如下: ...

    说明

    项目中的一个需求是定期将服务器A中的文件夹及所有文件转存到B服务器中。
    解决思路:在A服务器中注册一个Windows服务,通过Timer来控制定期执行,读取A服务器本地文件夹及文件通过FTP的方式上传到B服务器对应的文件夹中。

    以下代码是做了一个服务注册工具
    效果如下图:
    在这里插入图片描述
    实现代码如下:

    using System;
    using System.Windows.Forms;
    using System.ServiceProcess;
    using System.Configuration.Install;
    using System.Collections;
    using System.ComponentModel;
    using System.Runtime.CompilerServices;
    
    namespace SyncAPP
    {
        public partial class FrmMain : Form
        {
            public FrmMain()
            {
                InitializeComponent();
            }
            string serviceFilePath = $"{Application.StartupPath}\\SyncService.exe";
            string serviceName = "SyncMainService";
    
            private void FrmMain_Load(object sender, EventArgs e)
            {
    
            }
    
            /// <summary>
            /// 判断服务是否存在
            /// </summary>
            /// <param name="serviceName">服务名称</param>
            /// <returns></returns>
            private bool IsServiceExisted(string serviceName)
            {
                ServiceController[] services = ServiceController.GetServices();
                foreach (ServiceController sc in services)
                {
                    if (sc.ServiceName.ToLower() == serviceName.ToLower())
                    {
                        return true;
                    }
                }
                return false;
            }
            /// <summary>
            /// 安装服务
            /// </summary>
            /// <param name="serviceFilePath"></param>
            private void InstallService(string serviceFilePath)
            {
                using (AssemblyInstaller installer = new AssemblyInstaller())
                {
                    installer.UseNewContext = true;
                    installer.Path = serviceFilePath;
                    IDictionary savedState = new Hashtable();
                    installer.Install(savedState);
                    installer.Commit(savedState);
                    MessageBox.Show("安装成功!", "安装服务", MessageBoxButtons.OK);
                }
            }
    
            /// <summary>
            /// 卸载服务
            /// </summary>
            /// <param name="serviceFilePath"></param>
            private void UninstallService(string serviceFilePath)
            {
                using (AssemblyInstaller installer = new AssemblyInstaller())
                {
                    installer.UseNewContext = true;
                    installer.Path = serviceFilePath;
                    installer.Uninstall(null);
                    MessageBox.Show("卸载成功!", "卸载服务", MessageBoxButtons.OK);
                }
            }
    
    
            /// <summary>
            /// 启动服务
            /// </summary>
            /// <param name="serviceName"></param>
            private void ServiceStart(string serviceName)
            {
                using (ServiceController control = new ServiceController(serviceName))
                {
                    if (control.Status == ServiceControllerStatus.Stopped)
                    {
                        control.Start();
                        MessageBox.Show("启动成功!", "启动服务", MessageBoxButtons.OK);
                    }
                }
            }
    
            /// <summary>
            /// 停止服务
            /// </summary>
            /// <param name="serviceName"></param>
            private void ServiceStop(string serviceName)
            {
                using (ServiceController control = new ServiceController(serviceName))
                {
                    if (control.Status == ServiceControllerStatus.Running)
                    {
                        control.Stop();
                        MessageBox.Show("停止成功!", "停止服务", MessageBoxButtons.OK);
                    }
                }
            }
    
            private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)
            {
                //if (this.IsServiceExisted(serviceName)) this.UninstallService(serviceFilePath);
            }
    
            private void btnSyncStart_Click(object sender, EventArgs e)
            {
                if (this.IsServiceExisted(serviceName)) this.ServiceStart(serviceName);
            }
    
            private void btnSyncClose_Click(object sender, EventArgs e)
            {
                if (this.IsServiceExisted(serviceName)) this.ServiceStop(serviceName);
            }
    
            private void btn_init_Click(object sender, EventArgs e)
            {
                if (this.IsServiceExisted(serviceName)) this.UninstallService(serviceFilePath);
                this.InstallService(serviceFilePath);
            }
    
            private void btn_uninstall_Click(object sender, EventArgs e)
            {
                if (this.IsServiceExisted(serviceName)) this.UninstallService(serviceFilePath);
            }
        }
    }
    
    

    Windows服务中做逻辑代码:

    using Library.Interface;
    using Library.Normal;
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Configuration;
    using System.Data;
    using System.Diagnostics;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Reflection;
    using System.ServiceProcess;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Xml.Linq;
    
    namespace SyncService
    {
        public partial class SyncMainService : ServiceBase
        {
            public SyncMainService()
            {
            	//Ctrace是自己写的打印日志类,此处可换为自己的打印日志的类
                CTrace.Init(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "logs\\MoveRecord.log"), CTrace.TraceLevel.Debug5, CTrace.TraceOption.All ^ CTrace.TraceOption.Date);
                InitializeComponent();
            }
    		//FTP连接的IP、用户名、密码
            static string ftppath = ConfigurationManager.AppSettings["ftppath"].ToString();
            static string ftpuser = ConfigurationManager.AppSettings["ftpuser"].ToString();
            static string ftppwd = ConfigurationManager.AppSettings["ftppwd"].ToString();
    
            /// <summary>
            /// 服务启动时执行
            /// </summary>
            /// <param name="args"></param>
            protected override void OnStart(string[] args)
            {
                CTrace.Write("MoveRecord Start <" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "> Success");
                //服务启动默认执行一次
                MoveRecord();
                System.Timers.Timer timer = new System.Timers.Timer();
                timer.Enabled = true;
                timer.Interval = 1000 * 3600; //执行间隔时间,单位为毫秒; 这里实际间隔为1小时
                timer.Start();
                timer.Elapsed += new System.Timers.ElapsedEventHandler(TimerCheck);
            }
    
            private void TimerCheck(object source, System.Timers.ElapsedEventArgs e)
            {
            	//设置每天0点执行
                if (DateTime.Now.Hour == 0)
                {
                    MoveRecord();
                }
            }
    
            private void MoveRecord()
            {
                try
                {
                    CTrace.Write("MoveRecord TimerAction <" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "> Success");
    
                    string path = ConfigurationManager.AppSettings["r_path"].ToString();
                    string type = ConfigurationManager.AppSettings["r_type"].ToString();
                    string key = ConfigurationManager.AppSettings["r_key"].ToString();
                    //CWebData是自己写的读数据库的类,此处可换成自己的读数据库方式
                    var response = CWebData.GetData(path, type, key);
                    if (response.Code == WebCode.Success && response.Data.Rows.Count != 0)
                    {
                    	//ExtendMethod类是DataTable转实体类,具体实现代码在本文章结尾代码块
                    	//RecordInfo是自己用到的实体,记录了本条记录对应的文件存的服务器IP地址、完整路径、文件名
                        List<RecordInfo> li = ExtendMethod.ToDataList<RecordInfo>(response.Data);
                        foreach (RecordInfo info in li)
                        {
                        	//本机只有C盘,而服务器中存的是D盘,所以本机测试时替换为C盘
                            //string filepath =  info.FILEPATH.Replace("D","C") + info.FILENAME;
    						string filepath = info.FILEPATH + info.FILENAME;
                            CTrace.Write($"File:{info.FILEIP}/{info.FILEPATH}/{info.FILENAME}");
                            //文件上传
                            UploadFile(filepath, ftppath, info.FILEPATH, info.FILENAME);
                            Thread.Sleep(10);
                        }
                    }
    
                }
                catch (Exception exc)
                {
                    CTrace.Write($"MoveRecord TimerCheck Error<{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}>:Cause:{exc.Message}");
                }
            }
    
            //文件上传
            public void UploadFile(string localFile, string ftpPath, string dirName, string fileName)
            {   //检查本地文件是否存在
                if (!File.Exists(localFile))
                {
                    CTrace.Write($"UploadFile<{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}>{localFile}不存在!");
                    return;
                }
                //检查FTP的目录路径是否存在
                if (!CheckDirectoryExist(ftpPath, dirName))
                {
                    //创建文件夹
                    MakeDir(ftpPath, dirName);
                }
                //此处的uri拼装,在CheckDirectoryExist中有解释
                string uri = "ftp://" + ftpPath + "/" + dirName + fileName;
                uri = uri.Replace("\\", "/");
                uri = uri.Replace("D:/", "");
                FileInfo fileInfo = new FileInfo(localFile);
                FtpWebRequest reqFtp;
                //根据URI创建FTP对象
                reqFtp = (FtpWebRequest)FtpWebRequest.Create(uri);
                CTrace.Write($"UploadFile<{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}>Create URI:{uri}");
                //设置用户名与密码
                reqFtp.Credentials = new NetworkCredential(ftpuser, ftppwd);
                reqFtp.KeepAlive = false;
                reqFtp.Method = WebRequestMethods.Ftp.UploadFile;
                //指定数据传输类型
                reqFtp.UseBinary = true;
                reqFtp.ContentLength = fileInfo.Length;
                //缓冲为2kb
                int buffLength = 2048;
                byte[] buff = new byte[buffLength];
                int contentLen;
                //打开文件流读取上传的文件
                FileStream fs = fileInfo.OpenRead();
                try
                {
                    Stream stream = reqFtp.GetRequestStream();//上传的文件写入文件流
                    contentLen = fs.Read(buff, 0, buff.Length);//每次读取2kb
                    while (contentLen != 0)
                    {
                        //把内容从File Stream写入Upload Stream中
                        stream.Write(buff, 0, contentLen);
                        contentLen = fs.Read(buff, 0, buffLength);
                    }
                    stream.Close();
                    fs.Close();
                    CTrace.Write($"UploadFile<{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}>上传成功!");
                    JObject jParams = new JObject();
                    jParams.Add(new JProperty("rid", recordid));
                    jParams.Add(new JProperty("rip", ftpPath));
                    //更新迁移后的录音记录,IP地址及迁移标志
                    CWebData.SaveData(ConfigurationManager.AppSettings["rsave_path"].ToString(), ConfigurationManager.AppSettings["rsave_type"].ToString(), ConfigurationManager.AppSettings["rsave_key"].ToString(), jParams);
                    //本地文件删除
                    DelDir(dirName + fileName);
                }
                catch (Exception e)
                {
                    CTrace.Write($"UploadFile<{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}>上传失败!Cause:{e.Message}");
                }
            }
    
            //检查FTP目录是否存在
            private bool CheckDirectoryExist(string path, string dirName)
            {
                bool flag = true;
                try
                {
                    //dirName值为D:\Sound\20200709\ 组装后的uri值为ftp://127.0.0.1/D:\Sound\20200709\
                    string uri = "ftp://" + path + "/" + dirName;
                    //将'\'替换为'/' 替换后uri值为ftp://127.0.0.1/D:/Sound/20200709/
                    uri = uri.Replace("\\", "/");
                    //服务器中将整个D盘做了FTP所以路径中并不需要【D:/】 替换后uri值为ftp://127.0.0.1/Sound/20200709/
                    uri = uri.Replace("D:/", "");
                    //将url中最后的'/'去掉,得到最终uri为ftp://127.0.0.1/Sound/20200709
                    uri = uri.Substring(0, uri.Length - 1);
                    CTrace.Write($"CheckDirectoryExist<{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}>Create URI:{uri}");
                    FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(uri);
                    ftp.Credentials = new NetworkCredential(ftpuser, ftppwd);
                    ftp.Method = WebRequestMethods.Ftp.ListDirectory;
                    FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
                    response.Close();
                }
                catch (Exception)
                {
                    flag = false;
                }
                CTrace.Write($"CheckDirectoryExist<{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}>Done Flag:{flag.ToString()}");
                return flag;
            }
    
            //FTP创建文件夹
            private void MakeDir(string path, string dirName)
            {
                FtpWebRequest ftp;
                try
                {
                    string ui = "ftp://" + path + "/" + dirName;
                    ui = ui.Replace("\\", "/");
                    ui = ui.Replace("D:/", "");
                    ui = ui.Substring(0, ui.Length - 1);
                    CTrace.Write($"MakeDir <{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}> {ui}");
                    ftp = (FtpWebRequest)FtpWebRequest.Create(ui);
                    ftp.Method = WebRequestMethods.Ftp.MakeDirectory;
                    ftp.UseBinary = true;
                    ftp.Credentials = new NetworkCredential(ftpuser, ftppwd);
                    FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
                    Stream stream = response.GetResponseStream();
                    stream.Close();
                    response.Close();
                    CTrace.Write($"MakeDir <{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}> Success");
                }
                catch (Exception ex)
                {
                    CTrace.Write($"MakeDir Error<{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}>,Cause:{ex.Message}");
                }
            }
    		//filePath = @"c:\ttt\ttt.txt" or @"c:\ttt\"
            //删除文件
            private void DelDir(string filePath)
            {
                try
                {
                    CTrace.Write($"DelDir <{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}>,filePath:{filePath}");
                    //判断文件或文件路径是否存在
                    if (File.Exists(filePath))
                    {
                        //根据路径判断是文件还是文件夹
                        FileAttributes attr = File.GetAttributes(filePath);
                        //根据具体类型进行删除
                        if (attr == FileAttributes.Directory)
                        {
                            //删除文件夹
                            Directory.Delete(filePath, true);
                        }
                        else
                        {
                            //删除文件
                            File.Delete(filePath);
                        }
                        CTrace.Write($"DelDir Success<{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}>,Cause:{filePath}已删除!");
                    }
                    else
                    {
                        CTrace.Write($"DelDir Error<{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}>,Cause:{filePath}不存在!");
                    }
                }
                catch(Exception ex)
                {
                    CTrace.Write($"DelDir Error<{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}>,Cause:{ex.Message}!");
                }
                
            }
    
            /// <summary>
            /// 服务关闭时执行
            /// </summary>
            protected override void OnStop()
            {
                CTrace.Write("MoveRecord Stop <" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "> Success");
            }
        }
    }
    
    

    转实体类代码如下:

    using System;
    using System.Collections.Generic;
    using System.Data;
    using System.Linq;
    using System.Reflection;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace SyncService
    {
        public static class ExtendMethod
        {
            /// <summary>
            /// DataTable转成List
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="dt"></param>
            /// <returns></returns>
            public static List<T> ToDataList<T>(this DataTable dt)
            {
                var list = new List<T>();
                var plist = new List<PropertyInfo>(typeof(T).GetProperties());
                foreach (DataRow item in dt.Rows)
                {
                    T s = Activator.CreateInstance<T>();
                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        PropertyInfo info = plist.Find(p => p.Name == dt.Columns[i].ColumnName);
                        if (info != null)
                        {
                            try
                            {
                                if (!Convert.IsDBNull(item[i]))
                                {
                                    object v = null;
                                    if (info.PropertyType.ToString().Contains("System.Nullable"))
                                    {
                                        v = Convert.ChangeType(item[i], Nullable.GetUnderlyingType(info.PropertyType));
                                    }
                                    else
                                    {
                                        v = Convert.ChangeType(item[i], info.PropertyType);
                                    }
                                    info.SetValue(s, v, null);
                                }
                            }
                            catch (Exception ex)
                            {
                                throw new Exception("字段[" + info.Name + "]转换出错," + ex.Message);
                            }
                        }
                    }
                    list.Add(s);
                }
                return list;
            }
    
            /// <summary>
            /// DataTable转成Dto
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="dt"></param>
            /// <returns></returns>
            public static T ToDataDto<T>(this DataTable dt)
            {
                T s = Activator.CreateInstance<T>();
                if (dt == null || dt.Rows.Count == 0)
                {
                    return s;
                }
                var plist = new List<PropertyInfo>(typeof(T).GetProperties());
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    PropertyInfo info = plist.Find(p => p.Name == dt.Columns[i].ColumnName);
                    if (info != null)
                    {
                        try
                        {
                            if (!Convert.IsDBNull(dt.Rows[0][i]))
                            {
                                object v = null;
                                if (info.PropertyType.ToString().Contains("System.Nullable"))
                                {
                                    v = Convert.ChangeType(dt.Rows[0][i], Nullable.GetUnderlyingType(info.PropertyType));
                                }
                                else
                                {
                                    v = Convert.ChangeType(dt.Rows[0][i], info.PropertyType);
                                }
                                info.SetValue(s, v, null);
                            }
                        }
                        catch (Exception ex)
                        {
                            throw new Exception("字段[" + info.Name + "]转换出错," + ex.Message);
                        }
                    }
                }
                return s;
            }
    
            /// <summary>
            /// 将实体集合转换为DataTable
            /// </summary>
            /// <typeparam name="T">实体类型</typeparam>
            /// <param name="entities">实体集合</param>
            public static DataTable ToDataTable<T>(List<T> entities)
            {
                var result = CreateTable<T>();
                FillData(result, entities);
                return result;
            }
    
            /// <summary>
            /// 创建表
            /// </summary>
            private static DataTable CreateTable<T>()
            {
                var result = new DataTable();
                var type = typeof(T);
                foreach (var property in type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance))
                {
                    var propertyType = property.PropertyType;
                    if ((propertyType.IsGenericType) && (propertyType.GetGenericTypeDefinition() == typeof(Nullable<>)))
                        propertyType = propertyType.GetGenericArguments()[0];
                    result.Columns.Add(property.Name, propertyType);
                }
                return result;
            }
    
            /// <summary>
            /// 填充数据
            /// </summary>
            private static void FillData<T>(DataTable dt, IEnumerable<T> entities)
            {
                foreach (var entity in entities)
                {
                    dt.Rows.Add(CreateRow(dt, entity));
                }
            }
    
            /// <summary>
            /// 创建行
            /// </summary>
            private static DataRow CreateRow<T>(DataTable dt, T entity)
            {
                DataRow row = dt.NewRow();
                var type = typeof(T);
                foreach (var property in type.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance))
                {
                    row[property.Name] = property.GetValue(entity) ?? DBNull.Value;
                }
                return row;
            }
        }
    }
    
    
    展开全文
  • 需求在组内服务器上搭建数据备份服务器,要求实验用电脑可以定时(如12小时/24小时等)备份所选文件夹的数据文件。备份位置在服务器D盘上建立Backup文件夹。解决方案:rar命令+ftp命令+bat批处理程序+windows计划...

    需求

    在组内服务器上搭建数据备份服务器,要求实验用电脑可以定时(如12小时/24小时等)备份所选文件夹的数据文件。备份位置在服务器D盘上建立Backup文件夹。

    解决方案:rar命令+ftp命令+bat批处理程序+windows计划任务

    1. 利用rar命令在本地打包备份文件夹,并存放到一个本地备份文件夹;
    2. 利用ftp命令将打包文件上传到服务器备份文件夹
    3. 将bat程序添加到windows计划任务中,设置定时间隔。

    具体文件

    • backup.lst 
      用于指定需要打包的文件夹。增加或者删除非常方便,就添加/删除一条路径。可以只选择特定格式的文件
    E:\major\qutip\*.*   //打包所有格式文件。若只需要特定格式使用./*.doc等
    F:\PICTURE\*.*
    • 1
    • 2
    • ftp.bat 
      用于执行打包文件夹,命名格式为当前日期时间。然后执行ftp.txt中的ftp命令。
    set time_hh=%time:~0,2%
    if /i %time_hh% LSS 10 (set time_hh=0%time:~1,1%)
    set filename=%date:~,4%%date:~5,2%%date:~8,2%_%time_hh%%time:~3,2%%time:~6,2%
    rar a -m5 -r Mybackup-%filename%.rar @backup.lst
    ftp -s:E:\backup\ftp.txt
    mkdir local_backup
    move E:\backup\Mybackup-%filename%.rar E:\backup\local_backup   //将压缩文件移动到本地备份文件夹中
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • ftp.txt 
      都为ftp命令,通过用户名密码连接服务器,然后上传rar文件。
    open serverIP
    username
    passward
    cd .\backup
    mkdir test
    cd .\test
    binary
    put E:\backup\*.rar
    bye
    展开全文
  • Windows系统定时上传文件至FTP

    千次阅读 2020-04-28 14:57:05
    基本操作: 1.cmd下,输入ftp host或者先输入ftp,然后输入open host,其中host为要连接的计算机名、IP地址或FTP服务器的IPv6地址。... 4.put source [file1],将本地source文件传送到服务器上,并更名为file1,...
  • Linux远程服务器文件上传与下载

    千次阅读 2018-02-05 09:38:50
    在日常开发场景中,不定时地会在远程服务器本地之间进行文件传送。 博文主要介绍基于远程访问软件(eg.SecureCRT、PuTTY),通过 Linux 命令完成文件上传 / 下载。 实现方式 1 基于 SSH 文件传输协议,...
  • 定时刷新,一但那边的服务器上传文件,就下载 2.从Redis中获取文件名称(此时的Redis相当于一个消息队列) /** * @Author Ragty * @Description 定时程序(每十秒请求一次) * @Date 15:05 2019/3/19 **/ ...
  • C# WinForm源代码,可以实现定时截取当前屏幕,然后存为本地图片,再将其上传至远程服务器端,上传图片到服务器。也包含上传文件服务器端的方法。通过Ftp协议上传,更改源代码中ftp中IP地址、用户名及密码即可使用...
  • 首先在本地workspace项目项目中找到classes文件上传服务器 > 然后将classes文件名改为项目名 (我的文件名改为了clearExcel) > 然后编写一个bat脚本文件放在clearExcel文件下 > 然后到控制面板 > 管理工具 > ...
  • 一、背景: 最近一个老系统生产环境出现了问题,这个系统的其中之一...报送环节,上传到远端SFTP服务器的文件出现编码错误,本地文件是UTF-8格式,但是偶然会出现报送文件为:UTF-8-BOM 三、排查: 排查了java代...
  • 用Python实现定时备份Mongodb数据,并上传到FTP服务器实现的功能:在win7下,每天晚上1点,自动将 F:/data中所有文件进行压缩,以[mongodb+日期]命名,将压缩好的文件存储在本地目录 F:\MongoDbData\,然后将这个...
  • 需要定时把阿里云服务器上的数据备份文件下载到本地备份,所以需要在本地win10系统上定时执行从阿里云服务器上下载备份文件的操作。 环境和工具 本地win10系统及自带的SCP工具,工具目录:C:\Windows\System32\...
  • 需求:A服务器定时生成一个CSV文件,B服务器从A服务器下载下来,并存入到B服务器的oracle数据库的某表中。 分析:1.数据同步上传和下载可以使用ftp的方式,当然也有其他方式。 2.数据存到本地后可以使用oracle...
  • 定时备份 MySQL 并上传到七牛 多数应用场景下,我们需要对重要数据进行备份、并放置到一个安全的...常见的数据存储方式有,本机存储、FTP 上传到远程服务器、云存储(如阿里云OSS、七牛云存储等)、甚至本地也行。 ...
  • 除此之外,还可以实现自动重连,自动重传,定时任务 (定时上传、定时下载),自定义传输模式,线程,编码,删除到回收站,大量文件快速加载,边加载边传输,批量连接一键关闭,真正做到一站式管理,使用非常便捷。...
  • Linux VPS一键备份脚本 1.1 backup.sh下载 backup.sh的主要特点有: ...5、支持在删除指定天数本地旧的备份文件的同时,也删除 GoogleDrive 上的同名文件(可选)。 下载该脚本并赋予执行权限: wg
  • 常见的数据存储方式有,本机存储、FTP 上传到远程服务器、云存储(如阿里云OSS、七牛云存储等)、甚至本地也行。 我们可能不想每次都手动去备份,也不想每次都那么耗时间的去下载,也不想就放在服务器上丢了,因为我们...
  • 目录 1、Spring Security Spring Security重构代码 2、Redis统计网站数据 实现统计独立访客及日活跃用户 ...4、将文件上传到云服务器 (1)生成长图保存本地 (2)文件上传至云服务器 1、Spring Security D...
  • 1、本地编写定时任务时间运行文件上传服务器A、运行脚本SignFileBackup 内容(具体的shell格式请自行查阅): #!/bin/bash#以当天日期为压缩文件名date=`date +%Y%m%d`#文件名信息CURFILE=/backups/...
  • 服务器系统:Centos 7 服务器虚拟环境:docker 本地系统:win10 1,win10安装Docker,请参考... ...3,方法一,在本地win10中将python文件打包成镜像(需要编写Dockerfile,),上传镜像到CentOS服.
  • IIS7服务器管理工具中的ftp功能和vnc很像,都能支持批量操作,但是ftp比vnc更出色的地方在于ftp可以实现定时同步(上传或下载),自动更新功能。支持网页80端口下载,webshell批量上传下载。 而除了ftp功能,IIS7...
  • 用dos ftp命令写的将本地文件发送到远程ftp服务器的小程序,可直接运行上传文件也可将这个小程序添加到计划任务中定时执行.
  • C# FTP上传文件报550异常解决方案

    千次阅读 2019-08-12 05:03:03
    主要是对EMS物流这一块,每天定时上传礼品配送的信息,然后定时下载生成好的物流信息。 就是在上传的时候,遇到一个很怪异的问题。本地测试没有任务问题,但是放到服务器上问题就来了。 主要是在服务器上,上传...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 201
精华内容 80
关键字:

本地文件定时上传服务器