مشکل با flush در بافر ورودی و خروجی

mhabat

Member
سلام. کد زیر مربوط میشه به چیزی شبیه عمل خواندن و نوشتن فایل.
سورس:
کد:
#define LB
//#undef LB
#define SS
//#undef SS
//#define FS
//#define NB
#include "Everything.h"
/* BigBuffer Defined? */
#ifdef LB
#define BUF_SIZE 8192
#endif
#ifndef LB
#define BUF_SIZE 256
#endif
/* Set sequential scan flags? */
#ifdef SS
#define SSF FILE_FLAG_SEQUENTIAL_SCAN
#endif
#ifndef SS
#define SSF 0
#endif
/* Buffer I/O */
#ifdef NB
#define NBF FILE_FLAG_NO_BUFFERING
#endif
#ifndef NB
#define NBF 0
#endif
/* Flush buffers at end */
#define FL
 
BOOL cci_f (LPCTSTR fIn, LPCTSTR fOut,  DWORD shift)
/* Caesar cipher file encryption function  - Simple implementation
 *  fIn:  Source file pathname
 *  fOut:  Destination file pathname
 *  shift:  Numerical shift
 * Behavior is modeled after CopyFile */
{
 HANDLE hIn, hOut;
 DWORD nIn, nOut, iCopy;
 LARGE_INTEGER fileSize, filePosZero;
 CHAR aBuffer [BUF_SIZE], ccBuffer [BUF_SIZE];
 BOOL WriteOK = TRUE;
 filePosZero.QuadPart = 0;
 hIn = CreateFile (fIn, GENERIC_READ, 0, NULL, OPEN_EXISTING, 
   FILE_ATTRIBUTE_NORMAL | SSF | NBF, NULL);
 if (hIn == INVALID_HANDLE_VALUE) return FALSE;
 if (!GetFileSizeEx (hIn, &fileSize)) return FALSE;
 hOut = CreateFile (fOut, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
   FILE_ATTRIBUTE_NORMAL | SSF | NBF, NULL);
 if (hOut == INVALID_HANDLE_VALUE) return FALSE;
#ifdef FS
 SetFilePointerEx (hOut, fileSize, NULL, FILE_BEGIN);
 SetEndOfFile (hOut);
 SetFilePointerEx (hOut, 0, NULL, FILE_BEGIN);
#endif
 while (ReadFile (hIn, aBuffer, BUF_SIZE, &nIn, NULL) && nIn > 0 && WriteOK) {
  for (iCopy = 0; iCopy < nIn; iCopy++)
   ccBuffer [iCopy] = (BYTE)((aBuffer [iCopy] + shift) % 256);
  WriteOK = WriteFile (hOut, ccBuffer, nIn, &nOut, NULL);
 }
#ifdef FL
 FlushFileBuffers (hOut);
#endif
 CloseHandle (hIn);
 CloseHandle (hOut);
 return WriteOK;
}

1- می دونم define چیشه ولی داخل سورس بالا از این طور کلماتی استفاده شده که نمی دونم چین!
کد:
#ifdef LB
#define BUF_SIZE 8192
#endif
#ifndef LB
#define BUF_SIZE 256
#endif
2-این قسمت هم متوجه نشدم:
کد:
#ifdef FS
 SetFilePointerEx (hOut, fileSize, NULL, FILE_BEGIN);
 SetEndOfFile (hOut);
 SetFilePointerEx (hOut, 0, NULL, FILE_BEGIN);
#endif

3-
کد:
#ifdef FL
 FlushFileBuffers (hOut);
#endif
 

the_king

مدیرکل انجمن
1- می دونم define چیشه ولی داخل سورس بالا از این طور کلماتی استفاده شده که نمی دونم چین!
کد:
#ifdef LB
#define BUF_SIZE 8192
#endif
#ifndef LB
#define BUF_SIZE 256
#endif
تعریف شدن یا نشدن یک موردی رو برای اعمال کردن یکسری تغییرات در نظر می گیرند، برای هر موردی شرط ifdef وقتی برقراره که تعریف باشه و
ifndef اگر تعریف نشده باشه. فرضا حجم بافر رو 256 نظر می گیرند، مگر اینکه LB تعریف شده باشه که حجم اش 8192 بشه.

2-این قسمت هم متوجه نشدم:
کد:
#ifdef FS
 SetFilePointerEx (hOut, fileSize, NULL, FILE_BEGIN);
 SetEndOfFile (hOut);
 SetFilePointerEx (hOut, 0, NULL, FILE_BEGIN);
#endif
منظور نویسنده کد رو از خودش باید بپرسید، اگه FS تعریف شده باشه، موقعیت اشاره گر رو به ابتدای فایل hOut (که الان این فایل بازه) می بره
و هر چه داده داخل فایل ذخیره شده پاک می کنه و دور میریزه (انتهای فایل رو همون موقعیت ابتدای فایل قرار میده).
اینکار یعنی پاک کردن محتویات یک فایل ای که باز است، بدون اینکه نیاز به بستن و باز کردن مجدد فایل باشه.

3-
کد:
#ifdef FL
 FlushFileBuffers (hOut);
#endif
اگر قراره باشه با هر تغییر کوچکی که روی محتویات فایل می دهیم بلافاصله تغییرات روی دیسک ثبت شود، جابجایی های غیر ضروری اما مکرر هد روی دیسک
وقت زیادی را تلف می کند، در نتیجه سرعت ثبت اطلاعات روی دیسک را کاهش می دهد. به همین جهت از بافر برای یکجا ثبت کردن تغییرات پی در پی استفاده می شود.
هر عملیاتی که برای نوشتن روی فایل انجام میشه، ابتدا در حافظه RAM بصورت بافر قرار می گیره و چند لحظه ای همانجا باقی می مونه تا اگر قراره عملیات
دیگری در ادامه اش انجام بشه، همه شان یکجا روی دیسک نوشته شوند تا در مجموع سرعت عملیات روی دیسک که ذاتا کند است بیشتر شود.

اگر به هر دلیلی نیاز است که همین الان از ثبت شدن تغییرات روی دیسک مطمئن شویم و خیالمان راحت باشد که دیگر چیزی ثبت نشده روی بافر نمانده باشد،
از FlushFileBuffers استفاده می شود، البته برای یک فایل مشخص. مثلا چند لحظه قبل از اینکه فلش درایو را از کامپیوتر جدا کنیم.
 

جدیدترین ارسال ها

بالا