專案中寫了乙個穿網閘檔案傳輸程式,定期掃瞄指定資料夾,並將檔案傳輸至網閘對側。但在使用過程中發現部分檔案經常被截斷傳輸,實際上程式中對該問題已經做了處理,linux系統使用lsof命令可以直接插到該檔案當前有沒有被寫入,windows系統使用嘗試重新命名檔案方式來確定檔案有沒有被占用。但實際應用中在windwos環境安裝的openssh來提供sftp server,該程式在檔案傳輸過程中,可以隨意重新命名,甚至刪除檔案。試了下free sftp,倒是與期望的一樣,會獨佔檔案。
為了解決上述問題,有個openfiles命令可以支援,但執行太慢,影響使用。查了相關資料,windows上沒有更好的辦法,原則上需要遍歷所有程序的核心物件,得到這些核心物件的路徑,與檔案路徑進行比對。
**如下:
.h
#pragma once
#include "stdafx.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#pragma comment(lib, "psapi.lib")
#define nt_success(status)(status == (ntstatus)0x00000000l)
#define status_info_length_mismatch((ntstatus)0xc0000004l)
#define status_buffer_overflow((ntstatus)0x80000005l)
#define systemhandleinformation((system_information_class)16)
#define filenameinformation((file_information_class)9)
typedef std::basic_string, std::allocator> tstring;
typedef struct _object_name_information
object_name_information, *pobject_name_information;
typedef enum _object_information_class
object_information_class, *pobject_information_class;
typedef ntstatus (winapi *ntqueryobject)(
_in_opt_ handle handle,
_in_ object_information_class objectinformationclass,
_out_opt_ pvoid objectinformation,
_in_ ulong objectinformationlength,
_out_opt_ pulong returnlength);
typedef struct _system_handle
system_handle, *psystem_handle;
typedef struct _system_handle_information
system_handle_information, *psystem_handle_information;
typedef ntstatus (winapi *ntquerysysteminformation)(
in system_information_class systeminformationclass,
out pvoid systeminformation,
in ulong systeminformationlength,
out pulong returnlength optional);
typedef ntstatus (winapi *ntqueryinformationfile)(
in handle filehandle,
out pio_status_block iostatusblock,
out pvoid fileinformation,
in ulong length,
in file_information_class fileinformationclass);
class ncscopedhandle
~ncscopedhandle()
}operator handle() const
phandle operator& ()
void operator=(handle handle)
_handle = handle;
}private:
handle _handle;
};// ncfilehandle
struct ncfilehandle
.cpp
_tchar* watchprocess = arglist[1];
_tchar* filepathname = arglist[2];
dword watchpid = getprocessidbyname(watchprocess);
handle currentprocess = getcurrentprocess();
byte filetype = getfiletype();
return findfilehandle(currentprocess,watchpid,filepathname,filetype);
}
C 檢測檔案是否被其他程序占用的幾種方法
在.net中檢測是很好實現的 可以利用 異常處理機制 故意對檔案進行操作,如果丟擲異樣,則可以根據異常資訊判斷出是否被其它程序占用,常用的有 1 try 2 lopen filen,of readwrite of share deny none 檢測返回值 3 try 第1,第3 可以通過丟擲的異常...
lsof 檢視檔案被哪個程序占用
lsof 是什麼意思?答 list open files 檢視某個檔案被哪些程序在讀寫 lsof 檔名 檢視某個程序開啟了哪些檔案 lsof c 程序名 lsof p 程序號 lsof用法小全 lsof d usr local 顯示目錄下被程序開啟的檔案 lsof d usr local 同上,但是...
檢視程序是否被注入執行緒(不在系統模組)
首先我們拿到該程序的程序模組,用來對比程序中線程的模組是否在這裡面 把這些模組放入到vector裡面 便利該程序的所有執行緒獲取模組的起始位址和大小,很快就可以得到偽裝執行緒。pragma region 依賴 typedef enum threadinfoclassthreadinfoclass t...