• 杀进程和取文件最近使用时间


    unit uFTPclient;

    interface

    uses
      SysUtils,Windows,Tlhelp32;

    const
       FILE_CREATE_TIME=0;    //文件建立时间
       FILE_MODIFY_TIME=1;    //修改时间
       FILE_ACCESS_TIME=2;    //最后访问时间

    type
      TFileTimes   =   (ftLastAccess,   ftLastWrite,   ftCreation);

    //文件是否正被使用
    function IsFileInUse(FName:string):Boolean;
    //提升权限
    //杀服务程序进程,它会提示"拒绝访问".其实只要程序拥有Debug权限即可
    //使用的时候先EnableDebugPrivilege提升权限,然后KillTask(ExeFileName: string)
    function EnableDebugPrivilege: Boolean;
    //查找进程  
    function FindProcessId(ExeFileName: string):THandle;
    //杀进程
    function KillTask(ExeFileName: string): Integer;
    //取文件最后使用时间
    function GetFileLastAccessTime(sFileName:string;uFlag:byte):TDateTime;
    //设置文件最后修改时间
    Function SetFileLastWriteTime(FileName:string; DateTime: TDateTime): Integer;

    implementation

    Function SetFileLastWriteTime(FileName:string; DateTime: TDateTime): Integer;
    var
      hFile                 : THandle;
      WriteTime, LocalTime  : TFILETIME;
      SystemTime            : TSystemTime;
    begin
      result:= 0;
      try
        hFile := FileOpen(FileName, fmOpenWrite or fmShareDenyNone);
        if hFile <= 0 then
        begin
          result:= 1;
        end else
        begin
          DateTimeToSystemTime(DateTime, SystemTime);
          SystemTimeToFileTime(SystemTime, LocalTime);
          LocalFileTimeToFileTime(Localtime, WriteTime);

          If not SetFileTime(hFile, nil, nil, @WriteTime) then
          begin
            result:= 2;
          end;
        end;
      finally
        FileClose(hFile);
      end;
    end;

    function IsFileInUse(FName:string):Boolean;  
    var  
      HFileRes:HFILE;  
    begin
      Result:=False;
      if not FileExists(FName) then
        Exit;
      HFileRes:=CreateFile(PChar(FName),GENERIC_READ or GENERIC_WRITE,0,
        nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
      Result:=(HFileRes=INVALID_HANDLE_VALUE);
      if not Result then
        CloseHandle(HFileRes);
    end;

    function EnableDebugPrivilege: Boolean;
      function EnablePrivilege(hToken: Cardinal; PrivName: string; bEnable: Boolean): Boolean;
      var
      TP: TOKEN_PRIVILEGES;
      Dummy: Cardinal;
      begin
      TP.PrivilegeCount := 1;
      LookupPrivilegeValue(nil, pchar(PrivName), TP.Privileges[0].Luid);
      if bEnable then
      TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
      else TP.Privileges[0].Attributes := 0;
      AdjustTokenPrivileges(hToken, False, TP, SizeOf(TP), nil, Dummy);
      Result := GetLastError = ERROR_SUCCESS;
      end;
    var
      hToken: Cardinal;
    begin
      OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken);
      result:=EnablePrivilege(hToken, 'SeDebugPrivilege', True);
      CloseHandle(hToken);
    end;

    function FindProcessId(ExeFileName: string):THandle;
    var
      ContinueLoop:BOOL;
      FSnapshotHandle:THandle;
      FProcessEntry32:TProcessEntry32;
    begin
      result:=0;
      FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
      FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);
      ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32);
      while integer(ContinueLoop)<>0 do
      begin
        if UpperCase(FProcessEntry32.szExeFile)=UpperCase(ExeFileName) then
        begin
          result:=FProcessEntry32.th32ProcessID;
          break;
        end;
        ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);
      end;
      CloseHandle (FSnapshotHandle);
    end;

    function KillTask(ExeFileName: string): Integer;
    const
      PROCESS_TERMINATE = $0001;
    var
      ContinueLoop: boolean;
      FSnapshotHandle: THandle;
      FProcessEntry32: TProcessEntry32;
    begin
      Result := 0;
      FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
      FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
      ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);

      while Integer(ContinueLoop) <> 0 do
      begin
      if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
      UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
      UpperCase(ExeFileName))) then
      Result := Integer(TerminateProcess(
      OpenProcess(PROCESS_TERMINATE,
      BOOL(0),
      FProcessEntry32.th32ProcessID),
      0));
      ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
      end;
      CloseHandle(FSnapshotHandle);
    end;

    function GetFileLastAccessTime(sFileName:string;uFlag:byte):TDateTime;
    var
      ffd:TWin32FindData;
      dft:DWord;
      lft:TFileTime;
      h:THandle;
    begin
      h:=FindFirstFile(PChar(sFileName),ffd);
      if h<>INVALID_HANDLE_VALUE then
      begin
      case uFlag of
      FILE_CREATE_TIME:FileTimeToLocalFileTime(ffd.ftCreationTime,lft);
      FILE_MODIFY_TIME:FileTimeToLocalFileTime(ffd.ftLastWriteTime,lft);
      FILE_ACCESS_TIME:FileTimeToLocalFileTime(ffd.ftLastAccessTime,lft);
      else
        FileTimeToLocalFileTime(ffd.ftLastAccessTime,lft);
      end;
      FileTimeToDosDateTime(lft,LongRec(dft).Hi,LongRec(dft).Lo);
      Result:=FileDateToDateTime(dft);
      windows.FindClose(h);
      end
      else
      result:=0;
    end;

    end.

  • 相关阅读:
    Emacs for OIer 的一些配置
    CF1336E Chiori and Doll Picking 【线性代数,组合计数】
    CF605E Intergalaxy Trips 【贪心,动态规划,期望】
    Luogu6329 【模板】点分树 | 震波
    [SDOI2014]数表
    [BZOJ4403]序列统计
    [BZOJ5099]Pionek
    SP1812 LCS2
    SA & SAM
    [HAOI2016]找相同字符
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/2940978.html
Copyright © 2020-2023  润新知