zoukankan      html  css  js  c++  java
  • EM数据包按规则更新

    //delphi

    unit emCopy;

    interface

    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ADODB, DB, StdCtrls, ExtCtrls;

    type
      TForm1 = class(TForm)
        ADOConnection1: TADOConnection;
        ADOQuery1: TADOQuery;
        ListBox1: TListBox;
        ADOQuery2: TADOQuery;
        ADOQuery3: TADOQuery;
        Button1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.dfm}

    //声明变量
    var
     sourceDir,targetDir,finalDir,finalDir1,filename,fileSeq : string;
        i ,  maxId , maxTmp : integer;
        subdir : tstrings;
        searchRec,FileRec: TsearchRec;

    var
        j ,k , l,beginpos,endpos : integer  ;

    var
      NewFileName,copystat: string;
      NewFile: TFileStream;
      OldFile: TFileStream;

    //校验目录名
    function IsValidDir(SearchRec:TSearchRec):Boolean;
    begin
    if (SearchRec.Attr=16) and
    (SearchRec.Name<>'.') and
    (SearchRec.Name<>'..') then
    Result:=True
    else
    Result:=False;
    end;

    function IsValidFile(SearchRec:TSearchRec):Boolean;
    begin
    if (SearchRec.Name<>'.') and
    (SearchRec.Name<>'..') then
    Result:=True
    else
    Result:=False;
    end;

     

    procedure TForm1.FormCreate(Sender: TObject);
    begin
        listbox1.Items.Add(DateTimeToStr(Now));
        listbox1.Items.Add('从库中读取目录信息...');
        try
            adoquery1.Open ;
            for i := 0 to adoquery1.RecordCount -1 do
            begin
                sourceDir := adoquery1.Fields[0].AsString;
                targetDir := adoquery1.Fields[1].AsString;
                listbox1.Items.Add('  源目录名是' + sourceDir);
                listbox1.Items.Add('  目标目录名是' + targetDir);

            end;
            adoquery1.Close;

            if DirectoryExists(sourceDir) and DirectoryExists(targetDir) then
            begin
                listbox1.Items.Add('源目录和目标目录检查完毕!');
                listbox1.Items.Add('--------------------------');
                subdir := TStringList.Create;
                if (FindFirst(sourceDir+'\*.*',faDirectory,searchRec)=0) then
                begin
                    if IsValidDir(SearchRec) then
                    begin
    //                    FileList(SearchRec);
                    end;
                end;
                while (FindNext(SearchRec) = 0) do
                begin
                    if IsValidDir(SearchRec) then
                    begin 
                        Form1.listbox1.Items.Add('正在处理'+SearchRec.Name+'餐厅数据...');
                        finalDir1 := sourceDir+'\'+SearchRec.Name+'\Send\';
                        finalDir := finalDir1 + '*.*' ;

                        //检查库中是否有餐厅记录,无则添加
                        listbox1.Items.Add('  正在从库中读出已有数据...');
                        Form1.ADOQuery2.SQL.Text :=  'select count(*) from copyinfo where StoreName = '''+SearchRec.Name+'''';
                        Form1.ADOQuery2.Open;
                        if (Form1.ADOQuery2.Fields[0].AsInteger = 0) then
                        begin
                            ADOQuery3.SQL.Text := 'insert into copyinfo values('''+SearchRec.Name+''',0,date(),''0'')';
                            ADOQuery3.ExecSQL;
                            ADOQuery3.Close;
                        end
                        else
                        begin
                        end;
                        Form1.ADOQuery2.Close;

                        //取出序列值
                        ADOQuery2.SQL.Text := 'select lastid from copyinfo where storename = ''' + SearchRec.Name + '''';
                        ADOQuery2.Open;
                        maxID := ADOQuery2.Fields[0].AsInteger;
                        ADOQuery2.Close;
                        listbox1.Items.Add('  '+SearchRec.Name+'餐厅已拷贝数据的最大编号为'+ inttostr(maxid));

                        //一个个取出文件
                        maxTmp := maxID ;

                        if (FindFirst(finalDir, faAnyFile, FileRec)=0) then
                        begin

                        end;
                        while (FindNext(FileRec) = 0) do
                        begin
                            copystat := '0' ;
                            if IsValidFile(FileRec) then
                            begin

                                fileseq := '';
                                filename := FileRec.Name ;
                                k := Length(FileRec.Name);
                                for j := 1 to k do
                                begin
                                    if filename[j] = 'P' then
                                    begin
                                        if j <> k-1 then
                                        begin
                                            beginpos := j +1 ;
                                        end;
                                    end;
                                    if filename[j] = '.' then
                                    begin
                                        endpos := j -1  ;
                                    end;
                                end;

                                //获得文件的编号
                                for l := beginpos to endpos do
                                begin
                                    fileseq := fileseq + filename[l] ;
                                end;

                                if strtoint(fileseq) > maxID then
                                begin
                                    listbox1.Items.Add('  正在拷贝'+FileRec.Name+' ...');
                                    NewFileName := targetdir+ '\' + FileRec.Name ;
                                    OldFile := TFileStream.Create(finalDir1+FileRec.Name, fmOpenRead);
                                    try
                                        NewFile := TFileStream.Create(NewFileName, fmCreate);
                                        try
                                            NewFile.CopyFrom(OldFile, OldFile.Size);
                                            FreeAndNil(NewFile);
                                        except
                                            copystat := '11' ;
                                        end;
                                        FreeAndNil(OldFile);
                                    except
                                        copystat := '12';
                                        listbox1.items.Add('  拷贝失败!');                                     
                                    end;
                                    if strtoint(fileseq) > maxTmp then
                                    begin
                                        maxTmp := strtoint(fileseq) ;
                                    end;
                                    ADOQuery3.SQL.Text := 'insert into logs(storename,copydate,copytime,filename,status) values (''' + SearchRec.Name + ''',date(),time(),'''+FileRec.Name +''','''+copystat+''')' ;
                                    ADOQuery3.ExecSQL ;
                                    ADOQuery3.Close ;
                                end;
                                ADOQuery3.SQL.Text := 'update copyinfo set lastid = '+ inttostr(maxTmp) + ' where storename = ''' + SearchRec.Name + '''' ;
                                ADOQuery3.ExecSQL ;
                                ADOQuery3.Close ;

                            end;
                        end;
                        FindClose(FileRec);

                        listbox1.Items.Add(SearchRec.Name+'餐厅数据处理完毕!');
                        listbox1.Items.Add('--------------------------');

                    end;
                end;

                FindClose(SearchRec);

            end
            else
            begin
                listbox1.Items.Add('  源目录或目标目录不存在!');
            end;

        except
           listbox1.Items.Add('无法从库中读取目录信息!');
        end;
    listbox1.Items.Add('更详细的日志信息清查询emCopy.mdb数据库中logs表!');
    listbox1.Items.SaveToFile('.\emCopy.log');

    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
        Form1.Close;
    end;

    end.


    //c#

    using System;
    using System.Data;
    using System.Data.OleDb;
    using System.IO;

    namespace emDataCopy
    {
     /// <summary>
     /// Class1 的摘要说明。
     /// </summary>
       
     class Class1
     {
      /// <summary>
      /// 应用程序的主入口点。
      /// </summary>
      [STAThread]
      static void Main(string[] args)
      {
       //
       // TODO: 在此处添加代码以启动应用程序
       //
       string sourceDir = "";
       string targetDir = "";

       //建立文件连接
       OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data source= .\emCopy.mdb");
       OleDbCommand cmd = new OleDbCommand();
       
       //取目录名
       try
       {
        conn.Open();
        cmd.Connection = conn;
        cmd.CommandText = @"select * from dir";
        OleDbDataReader dr = cmd.ExecuteReader();
        while (dr.Read())
        {
         sourceDir = dr["sourcedir"].ToString();
         Console.WriteLine("文件的源目录为 "+sourceDir);
         targetDir = dr["targetdir"].ToString();
         Console.WriteLine("文件的目标路径为 "+targetDir);
        }
       }
       catch
       {
        
       }
       finally
       {
        if (conn.State != ConnectionState.Closed) conn.Close();
       }
       
       //设定文件根目录
       DirectoryInfo dbase = new DirectoryInfo(sourceDir);
       
       //获得所有文件夹
       foreach(DirectoryInfo di in dbase.GetDirectories()) //di->每一个目录,如xianxia
       {
        
        DirectoryInfo di_ = new DirectoryInfo(di.FullName + @"\Send"); //di_ ->包含send的路径,每个店的数据上传位置

        Console.WriteLine("正在读取"+di.Name+"餐厅的数据信息...");

        if (di_.GetFiles().Length > 0) //如果该目录下文件个数大于0
        {
         try
         {
          conn.Open();
          cmd.Connection =conn;
          cmd.CommandText = @"select count(*) from CopyInfo where StoreName = '"+di.Name+"'" ;
          if((int)cmd.ExecuteScalar() == 0) //如果数据库中无该店信息
          {
           int seqMax = 0;
           foreach(FileInfo fi in di_.GetFiles())
           {
            string fileName = fi.Name;
            int posP = fileName.IndexOf(@"P")+1;
            string fileName_ = fileName.Substring(posP);
            int posDot = fileName_.IndexOf(@".");
            int seq = Convert.ToInt32(fileName_.Substring(0,posDot));
            Console.WriteLine("正在拷贝"+di.Name+"餐厅的数据包"+fi.Name+" ...");
            
            File.Copy(fi.FullName,targetDir+@"\"+fi.Name);
            if (seq > seqMax)
            {
             seqMax = seq;
            }
           }
           //往库中增加信息
           Console.WriteLine(di.Name+"餐厅数据包的最大编号为"+seqMax.ToString()+",正在保存到数据库...");
           cmd.CommandText="insert into CopyInfo values ('" + di.Name + "'," + seqMax.ToString() + ",Date(),'0')";
           if (cmd.ExecuteNonQuery()==1)
           {
            Console.WriteLine(di.Name+"餐厅数据包信息保存成功!");
           }
           else
           {
            Console.WriteLine(di.Name+"餐厅数据包信息保存失败!");
           }
          }
          else //有该店信息
          {
           cmd.CommandText = @"select lastid from CopyInfo where StoreName = '" + di.Name + "'" ;
           int id = (int)cmd.ExecuteScalar();

           int seqMax = id;
           foreach(FileInfo fi in di_.GetFiles())
           {
            string fileName = fi.Name;
            int posP = fileName.IndexOf(@"P")+1;
            string fileName_ = fileName.Substring(posP);
            int posDot = fileName_.IndexOf(@".");
            int seq = Convert.ToInt32(fileName_.Substring(0,posDot));
            if (seq > id)
            {
             Console.WriteLine("正在拷贝"+di.Name+"餐厅的数据包"+fi.Name+" ...");

             File.Copy(fi.FullName,targetDir+@"\"+fi.Name);

             if (seq > seqMax)
             {
              seqMax = seq;
             }
            }
           }
           //更新库中信息
           Console.WriteLine(di.Name+"餐厅数据包的最大编号为"+seqMax.ToString()+",正在保存到数据库...");

           cmd.CommandText = @"update CopyInfo set lastid = " + seqMax.ToString() + @",copyDate_ = Date() where StoreName = '" + di.Name + "'";
           if (cmd.ExecuteNonQuery()==1)
           {
            Console.WriteLine(di.Name+"餐厅数据包信息保存成功!");
           }
           else
           {
            Console.WriteLine(di.Name+"餐厅数据包信息保存失败!");
           }
          }
         }
         catch{}
         finally
         {
          if (conn.State != ConnectionState.Closed) conn.Close();
         }
        }
        else
        {
         Console.WriteLine(di.Name+"餐厅没有数据信息");
        }
       }
      }
     }
    }

    作者:thanks       微信:-       QQ:305380844
             
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    php程序去除文件 bom头
    类继承接口后,实现接口的方法
    virtual和abstract的使用场景分别是什么?待更新。
    get请求和post请求的总结
    ES6新语法,持续更新
    display:flex中的不懂的问题,待处理
    css相邻兄弟选择器(+),伪类(:hover),伪元素(::after)
    HTML中的input的type类型
    命令行打开程序的集合
    sqlserver 常用的语句
  • 原文地址:https://www.cnblogs.com/thanks/p/32346.html
Copyright © 2011-2022 走看看