如何用delphi编写程序监控某个文件夹,如 D:\mydoc,当程序运行时,不能打开这个文件夹。
我不想用其它软件加密文件夹,也不想设置隐藏。
可以实现吗?

解决方案 »

  1.   

    那用什么代码可以知道电脑使用者正在对“D:\mydoc”文件夹进行打开操作?并禁止这个文件夹被打开?
      

  2.   

    用你的程序独占打开文件夹
    duplicateHandle
      

  3.   

    谢谢gyk120,下面的代码可以独占一个文件的打开,但如何独占 文件夹 的打开呢?另,如何释放呢?//=========================================================
    procedure SetPrivilege;
    var
      TPPrev, TP: TTokenPrivileges;
      TokenHandle: THandle;
      dwRetLen: DWORD;
      lpLuid: TLargeInteger;
    begin
      OpenProcessToken(GetCurrentProcess, TOKEN_ALL_ACCESS, TokenHandle);
      if (LookupPrivilegeValue(nil, 'SeDebugPrivilege', lpLuid)) then
      begin
        TP.PrivilegeCount := 1;
        TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
        TP.Privileges[0].Luid := lpLuid;
        AdjustTokenPrivileges(TokenHandle, False, TP, SizeOf(TPPrev), TPPrev, dwRetLen);
      end;
      CloseHandle(TokenHandle);
    end;//===========================================procedure OccupyFile(lpFileName: string);
    var
      hProcess, hFile, hTargetHandle: thandle;
    begin
    //打开一个pid为4的进程,只要是存在的进程,都可以
    hProcess:=OpenProcess(PROCESS_DUP_HANDLE, FALSE,4);
      if (hProcess = 0) then exit;
      //以独占模式打开目标文件
      hFile := CreateFileA(PChar(lpFileName), GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
      if (hFile = INVALID_HANDLE_VALUE) then
      begin
       CloseHandle(hProcess);
      exit;
     end;
      //把文件句柄复制到pid=4的进程中去,这样,只要pid=4的进程不退出,谁也动不了目标文件
      DuplicateHandle(GetCurrentProcess(), hFile, hProcess, @hTargetHandle, 0, FALSE, DUPLICATE_SAME_ACCESS or DUPLICATE_CLOSE_SOURCE);
      CloseHandle(hProcess);  
    end;
    //=======================================================================
    procedure TForm1.Button1Click(Sender: TObject);
    begin  SetPrivilege;
      OccupyFile('D:\mydoc\1.doc');//这是要保护的文件名,如果是文件夹'D:\mydoc\'呢?end;
    //======================================================
      

  4.   

    文件夹……那就不好办了,DuplicateHandle只能一个文件一个文件操作,只能遍历然后取结果……