Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 14 kết quả

Đề tài: Xin hỏi về việc lưu vết với file và thư mục với VC++

  1. #1
    Ngày gia nhập
    09 2007
    Bài viết
    5

    Question Xin hỏi về việc lưu vết với file và thư mục với VC++

    Mình đang có một đề tài về VC++ là:"Ghi nhật ký làm việc trên máy đối với các tệp tin và thư mục". Hic nhưng nói thật đến giờ mình vẫn chưa biết bắt đầu từ đâu cả. Thầy hướng dẫn thì nói sử dụng một số hàm bắt sự kiện và lập trình hàm đa luồng để kiểm tra và lưu vết.
    Rất mong các bạn trợ giúp mình với. Bí quá rồi!

  2. #2
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    úi,việc này thì cậu bắt buộc phải Hook APi những hàm sau
    WriteFile
    DeleteFile
    CreateFile
    RemoveDirectory
    ReadFile
    ....
    cậu bắt sự kiện các hàm đó,ghi lại thời gian,hành động của các hàm đó lại,hehe,hơi mất nhiều công với bài này đó

  3. #3
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    Nếu là hook các hàm api thì có bài viết demo của bạn mèo con rồi, bạn search xem sao nhé ?

    Nhưng hình như cũng có 1 hàm để quản lí việc thao tác các tập tin ( mình nhớ là trên C#, còn VC thế nào thì ko rõ ) nhờ các pro vậy

  4. #4
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Có phải kidkid muốn nói đến FileSystemWatcher trong c# ko ? Thực ra nó dùng hàm api ReadDirectoryChangesW đó. Tóm lại là theo mình có 3 cách để thực hiện việc này ( từ dễ đến khó ) :
    - Dùng hàm api ReadDirectoryChanges, tham khảo trên MSDN
    - Liệt kê hết toàn bộ thư mục và file, lấy checksum, lưu lại trạng thái. Những lần duyệt sau sẽ so sánh với trạng thái gốc để phát hiện thay đổi.
    - Hook hàm api CreateFileW, hàm này "nắm trùm" hết các thao tác mở file trong tất cả các hàm của user mode, các hàm khác đều phải qua hàm này. Hoặc có thể hook sâu hơn vào trong ntdll, hay thậm chí nhân của win. Nhưng mình nghĩ với đề tài này thì ko cần.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  5. #5
    Ngày gia nhập
    01 2009
    Bài viết
    201

    Trích dẫn Nguyên bản được gửi bởi meoconlongvang Xem bài viết
    Có phải kidkid muốn nói đến FileSystemWatcher trong c# ko ? Thực ra nó dùng hàm api ReadDirectoryChangesW đó. Tóm lại là theo mình có 3 cách để thực hiện việc này ( từ dễ đến khó ) :
    - Dùng hàm api ReadDirectoryChanges, tham khảo trên MSDN
    - Liệt kê hết toàn bộ thư mục và file, lấy checksum, lưu lại trạng thái. Những lần duyệt sau sẽ so sánh với trạng thái gốc để phát hiện thay đổi.
    - Hook hàm api CreateFileW, hàm này "nắm trùm" hết các thao tác mở file trong tất cả các hàm của user mode, các hàm khác đều phải qua hàm này. Hoặc có thể hook sâu hơn vào trong ntdll, hay thậm chí nhân của win. Nhưng mình nghĩ với đề tài này thì ko cần.
    hàm api ReadDirectoryChanges có ghi lại được cả thao tác xóa thư mục rỗng không meoconlongvang

  6. #6
    Ngày gia nhập
    07 2007
    Nơi ở
    TP.HCM
    Bài viết
    199

    Mặc định Xin hỏi về việc lưu vết với file và thư mục với VC++

    Trong 3 cách mà mèocon đưa ra mình thấy chỉ có cách thứ 1 là khả thi thôi. Cách 2 thì chắc chắn không thể làm nổi, cách thứ 3 thì quá rắc rối, mỗi thao tác với file đều dùng hàm CreateFile, ngay cả đọc kích thước file cũng dùng hàm này, vậy sao phân biệt được createfile nào là mở đọc, mở tạo, mở ghi..., nếu dựa vào parameter thì cũng được, nhưng chắc khó mà làm triệt để lắm.

  7. #7
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Trích dẫn Nguyên bản được gửi bởi AdminPro Xem bài viết
    hàm api ReadDirectoryChanges có ghi lại được cả thao tác xóa thư mục rỗng không meoconlongvang
    Mình chưa thử xóa thư mục rỗng nên ko chắc, bạn rảnh thì code vài dòng thử xem.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  8. #8
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    Tớ có đọc qua mô tả thấy hàm ReadDirectoryChangesW có thể đáp ứng được yêu cầu của chủ topic, cậu code thử xem sao nhé .

  9. #9
    Ngày gia nhập
    01 2009
    Bài viết
    201

    Trích dẫn Nguyên bản được gửi bởi kidkid Xem bài viết
    Tớ có đọc qua mô tả thấy hàm ReadDirectoryChangesW có thể đáp ứng được yêu cầu của chủ topic, cậu code thử xem sao nhé .
    ReadDirectoryChangesW Function

    Retrieves information that describes the changes within the specified directory. The function does not report changes to the specified directory itself.

    To track changes on a volume, see change journals.


    Syntax
    BOOL WINAPI ReadDirectoryChangesW(
    __in HANDLE hDirectory,
    __out LPVOID lpBuffer,
    __in DWORD nBufferLength,
    __in BOOL bWatchSubtree,
    __in DWORD dwNotifyFilter,
    __out_opt LPDWORD lpBytesReturned,
    __inout_opt LPOVERLAPPED lpOverlapped,
    __in_opt LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
    );
    Parameters
    hDirectory
    A handle to the directory to be monitored. This directory must be opened with the FILE_LIST_DIRECTORY access right.

    Windows 2000: Only one handle is serviced at a time. Additional handle requests are not serviced until the previous service request is completed.
    lpBuffer
    A pointer to the DWORD-aligned formatted buffer in which the read results are to be returned. The structure of this buffer is defined by the FILE_NOTIFY_INFORMATION structure. This buffer is filled either synchronously or asynchronously, depending on how the directory is opened and what value is given to the lpOverlapped parameter. For more information, see the Remarks section.

    nBufferLength
    The size of the buffer that is pointed to by the lpBuffer parameter, in bytes.

    bWatchSubtree
    If this parameter is TRUE, the function monitors the directory tree rooted at the specified directory. If this parameter is FALSE, the function monitors only the directory specified by the hDirectory parameter.

    dwNotifyFilter
    The filter criteria that the function checks to determine if the wait operation has completed. This parameter can be one or more of the following values.

    Value Meaning
    FILE_NOTIFY_CHANGE_FILE_NAME
    0x00000001
    Any file name change in the watched directory or subtree causes a change notification wait operation to return. Changes include renaming, creating, or deleting a file.

    FILE_NOTIFY_CHANGE_DIR_NAME
    0x00000002
    Any directory-name change in the watched directory or subtree causes a change notification wait operation to return. Changes include creating or deleting a directory.

    FILE_NOTIFY_CHANGE_ATTRIBUTES
    0x00000004
    Any attribute change in the watched directory or subtree causes a change notification wait operation to return.

    FILE_NOTIFY_CHANGE_SIZE
    0x00000008
    Any file-size change in the watched directory or subtree causes a change notification wait operation to return. The operating system detects a change in file size only when the file is written to the disk. For operating systems that use extensive caching, detection occurs only when the cache is sufficiently flushed.

    FILE_NOTIFY_CHANGE_LAST_WRITE
    0x00000010
    Any change to the last write-time of files in the watched directory or subtree causes a change notification wait operation to return. The operating system detects a change to the last write-time only when the file is written to the disk. For operating systems that use extensive caching, detection occurs only when the cache is sufficiently flushed.

    FILE_NOTIFY_CHANGE_LAST_ACCESS
    0x00000020
    Any change to the last access time of files in the watched directory or subtree causes a change notification wait operation to return.

    FILE_NOTIFY_CHANGE_CREATION
    0x00000040
    Any change to the creation time of files in the watched directory or subtree causes a change notification wait operation to return.

    FILE_NOTIFY_CHANGE_SECURITY
    0x00000100
    Any security-descriptor change in the watched directory or subtree causes a change notification wait operation to return.


    lpBytesReturned
    For synchronous calls, this parameter receives the number of bytes transferred into the lpBuffer parameter. For asynchronous calls, this parameter is undefined. You must use an asynchronous notification technique to retrieve the number of bytes transferred.

    lpOverlapped
    A pointer to an OVERLAPPED structure that supplies data to be used during asynchronous operation. Otherwise, this value is NULL. The Offset and OffsetHigh members of this structure are not used.

    lpCompletionRoutine
    A pointer to a completion routine to be called when the operation has been completed or canceled and the calling thread is in an alertable wait state. For more information about this completion routine, see FileIOCompletionRoutine.

    Return Value
    If the function succeeds, the return value is nonzero. For synchronous calls, this means that the operation succeeded. For asynchronous calls, this indicates that the operation was successfully queued.

    If the function fails, the return value is zero (0). To get extended error information, call GetLastError.

    If the network redirector or the target file system does not support this operation, the function fails with ERROR_INVALID_FUNCTION.

    Remarks
    To obtain a handle to a directory, use the CreateFile function with the FILE_FLAG_BACKUP_SEMANTICS flag.

    A call to ReadDirectoryChangesW can be completed synchronously or asynchronously. To specify asynchronous completion, open the directory with CreateFile as shown above, but additionally specify the FILE_FLAG_OVERLAPPED attribute in the dwFlagsAndAttributes parameter. Then specify an OVERLAPPED structure when you call ReadDirectoryChangesW.

    When you first call ReadDirectoryChangesW, the system allocates a buffer to store change information. This buffer is associated with the directory handle until it is closed and its size does not change during its lifetime. Directory changes that occur between calls to this function are added to the buffer and then returned with the next call. If the buffer overflows, the entire contents of the buffer are discarded and the function fails with ERROR_NOTIFY_ENUM_DIR.

    Upon successful synchronous completion, the lpBuffer parameter is a formatted buffer and the number of bytes written to the buffer is available in lpBytesReturned. If the number of bytes transferred is zero (0), the buffer was too small to provide detailed information on all the changes that occurred in the directory or subtree. In this case, you should compute the changes by enumerating the directory or subtree.

    For asynchronous completion, you can receive notification in one of three ways:


    Using the GetOverlappedResult function. To receive notification through GetOverlappedResult, do not specify a completion routine in the lpCompletionRoutine parameter. Be sure to set the hEvent member of the OVERLAPPED structure to a unique event.
    Using the GetQueuedCompletionStatus function. To receive notification through GetQueuedCompletionStatus, do not specify a completion routine in lpCompletionRoutine. Associate the directory handle hDirectory with a completion port by calling the CreateIoCompletionPort function.
    Using a completion routine. To receive notification through a completion routine, do not associate the directory with a completion port. Specify a completion routine in lpCompletionRoutine. This routine is called whenever the operation has been completed or canceled while the thread is in an alertable wait state. The hEvent member of the OVERLAPPED structure is not used by the system, so you can use it yourself.
    ReadDirectoryChangesW fails with ERROR_INVALID_PARAMETER when the buffer length is greater than 64 KB and the application is monitoring a directory over the network. This is due to a packet size limitation with the underlying file sharing protocols.

    ReadDirectoryChangesW fails with ERROR_NOACCESS when the buffer is not aligned on a DWORD boundary.

    Windows 2000: Clients that attempt multiple simultaneous long-term requests against a server, for example change notifications, should be running Service Pack 2 or higher. See Knowledge Base article Q271148 for more details.
    To compile an application that uses this function, define the _WIN32_WINNT macro as 0x0400 or later. For more information, see Using the Windows Headers.

    If you opened the file using the short name, you can receive change notifications for the short name.

    Transacted Operations
    If there is a transaction bound to the directory handle, then the notifications follow the appropriate transaction isolation rules.

    Requirements
    Client Requires Windows Vista, Windows XP, or Windows 2000 Professional.
    Server Requires Windows Server 2008, Windows Server 2003, or Windows 2000 Server.
    Header Declared in WinBase.h; include Windows.h.

    Library Use Kernel32.lib.

    DLL Requires Kernel32.dll.


    See Also
    CreateFile
    CreateIoCompletionPort
    Directory Management Functions
    FileIOCompletionRoutine
    GetOverlappedResult
    GetQueuedCompletionStatus
    FILE_NOTIFY_INFORMATION
    OVERLAPPED



    Send comments about this topic to Microsoft

    Build date: 4/22/2008

    theo mình thì việc Hook hàm ReadDirectoryChanges thì lại phải kiểm tra trạng thái từng thư mục ah,vậy có tận vài chục nghìn thư mục thì ....

  10. #10
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Ủa mình ko hiểu, sao phải hook hàm ReadDirectoryChangesW để làm gì ? Bạn cứ đứng ở thư mục gốc và gọi hàm, truyền tham số bWatchSubtree = TRUE là có thể xem thay đổi trong thư mục con luôn mà.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

Các đề tài tương tự

  1. Cách add file thư viện dll vào file exe để tạo một file chạy duy nhất C#
    Gửi bởi nthung2112 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 20
    Bài viết cuối: 01-09-2012, 10:01 AM
  2. File backup .bak có dung lương lớn hơn file .mdb và file log
    Gửi bởi MYNAM trong diễn đàn Thắc mắc Microsoft SQL Server & Microsoft Access
    Trả lời: 4
    Bài viết cuối: 27-07-2012, 12:59 PM
  3. Giới thiệu cách chuyển File Ảnh thành file Video trong download proshow gold
    Gửi bởi thuhu0900x trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 3
    Bài viết cuối: 03-07-2012, 03:54 AM
  4. Đọc dữ liệu file midi dạng số HEX và lấy lời nhạc trong file ra file text
    Gửi bởi kimngockhtn_2007 trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 0
    Bài viết cuối: 29-06-2011, 04:40 PM
  5. Trả lời: 17
    Bài viết cuối: 23-05-2011, 11:47 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn