檢視檔案是否被其他程序訪問

2021-08-17 11:07:05 字數 2893 閱讀 9604

專案中寫了乙個穿網閘檔案傳輸程式,定期掃瞄指定資料夾,並將檔案傳輸至網閘對側。但在使用過程中發現部分檔案經常被截斷傳輸,實際上程式中對該問題已經做了處理,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...