Từ 1 tới 6 trên tổng số 6 kết quả

Đề tài: vấn đề với hàm SetFilePointer

  1. #1
    Ngày gia nhập
    04 2015
    Nơi ở
    Hà Nội, Vietnam
    Bài viết
    30

    Mặc định vấn đề với hàm SetFilePointer

    chào mọi người.
    hiện mình đang thắc mắc cách để chuyển con trỏ file xuống n BYTE cuối của file.
    dưới đây là cách mình dùng hàm này:
    Code:
     SetFilePointer(handle, n_byte, 0, FILE_END);
    thì chương trình lại mở rộng ra thêm n byte phía cuối file (mà mục đích của mình là trỏ vào n byte có sẵn phía cuối file chứ ko muốn tăng size).
    mong mọi người cho ý kiến.

  2. #2
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    717

    Trong trường hợp này thì bạn :
    _ Nhận kích thước tập tin : DWORD dwFileSize = GetFileSize(...);
    _ Lấy Offset cần di chuyển tới : DWORD dwOffset = dwFileSize - n_byte;
    _ Di chuyển : SetFilePointer(handle, dwOffset, 0, FILE_BEGIN);

    Đương nhiên, bạn phải có kiểm tra lỗi như dwFileSize == 0 hay dwFileSize < n_byte.
    Yêu mã hơn yêu em !!!

  3. #3
    Ngày gia nhập
    04 2015
    Nơi ở
    Hà Nội, Vietnam
    Bài viết
    30

    Trích dẫn Nguyên bản được gửi bởi MHoang Xem bài viết
    Trong trường hợp này thì bạn :
    _ Nhận kích thước tập tin : DWORD dwFileSize = GetFileSize(...);
    _ Lấy Offset cần di chuyển tới : DWORD dwOffset = dwFileSize - n_byte;
    _ Di chuyển : SetFilePointer(handle, dwOffset, 0, FILE_BEGIN);

    Đương nhiên, bạn phải có kiểm tra lỗi như dwFileSize == 0 hay dwFileSize < n_byte.
    em chào anh! em đã thử cách của anh. nhưng khi dùng SetEndOfFile để fix size lại thì không có hiện tượng gì, size của file vẫn không đổi, byte cuối vẫn tồn tại.
    debug code thì biết là hàm SetFilePointer không thực thi.
    đây là đoạn code:
    Code:
     if (INVALID_HANDLE_VALUE != (handle = CreateFile(filePath, GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL))) {
    						
    						 
    						 DWORD dwOffset = FileSize - 22475;
    						 SetFilePointer(handle, dwOffset, 0, FILE_END);
    						 SetEndOfFile(handle);
    						 CloseHandle(handle);
    					
    					 }
    Đã được chỉnh sửa lần cuối bởi huytohl : 31-07-2017 lúc 02:17 PM.

  4. #4
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    717

    Mình đã tô đậm dòng lệnh với tham số cuối là : FILE_BEGIN chứ không dùng FILE_END. Bạn sửa lại đi xem thử.
    Yêu mã hơn yêu em !!!

  5. #5
    Ngày gia nhập
    04 2015
    Nơi ở
    Hà Nội, Vietnam
    Bài viết
    30

    à vầng FILE_BEGIN, vừa rồi em chụp nhầm.
    vẫn ko được :(
    à 22475 là 22475 byte anh nhé. em không đổi ra kb.
    full đoạn xử lý:
    Code:
    if (INVALID_HANDLE_VALUE != (handle = CreateFile(filePath, GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL))) {
    
    						
    						DWORD dwOffset = FileSize - 22475;
    						if (SetFilePointer(handle, dwOffset, 0, FILE_BEGIN)==ERROR_SUCCESS)
    						{
    							ErrorExit(TEXT("SetFilePointer"));
    							MessageBox(NULL, "not set pointer", "huytohl", MB_OKCANCEL);
    						}
    						else
    							MessageBox(NULL, "set ok", "huytohl", MB_OKCANCEL);
    						
    						if (SetEndOfFile(handle) == ERROR_SUCCESS)
    						{
    							ErrorExit(TEXT("SetEndOfFile"));
    							MessageBox(NULL, "not fix", "huytohl", MB_OKCANCEL);
    						}
    						else
    							MessageBox(NULL, " fix ok", "huytohl", MB_OKCANCEL);
    						 CloseHandle(handle);
    					 }

  6. #6
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    717

    Mặc định vấn đề với hàm SetFilePointer

    Bỏ cờ FILE_FLAG_SEQUENTIAL_SCAN đi thay bằng FILE_ATTRIBUTE_NORMAL xem nó chạy có đúng không, nếu vẫn không được có thể đưa dự án lên mình tìm lỗi giúp.

    - - - Nội dung đã được cập nhật ngày 31-07-2017 lúc 02:59 PM - - -

    Thêm chút xíu : Điều kiện kiểm tra của bạn cũng không chính xác phải là :
    C Code:
    1. if (SetFilePointer(handle, dwOffset, 0, FILE_BEGIN)== -1)
    2.                         {
    3.                             ErrorExit(TEXT("SetFilePointer"));
    4.                             MessageBox(NULL, "not set pointer", "huytohl", MB_OKCANCEL);
    5.                         }
    Điều kiện kiểm tra bên dưới trong trường hợp này là đúng nhưng không nên viết vậy dễ nhầm lẫn mà nên
    C Code:
    1.                     if (!SetEndOfFile(handle))
    2.                         {
    3.                             ErrorExit(TEXT("SetEndOfFile"));
    4.                             MessageBox(NULL, "not fix", "huytohl", MB_OKCANCEL);
    5.                         }

    ERROR_SUCCESS = 0
    INVALID_SET_FILE_POINTER = -1
    Đã được chỉnh sửa lần cuối bởi MHoang : 31-07-2017 lúc 03:21 PM.
    Yêu mã hơn yêu em !!!

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