PDA

View Full Version : توضیح سورس کپی فایل



mhabat
چهارشنبه 03 مهر 1392, 14:32 عصر
سلام. کد زیر کارش کپی کردن فایل هست:

/* Chapter 1. Basic cp file copy program. Win32 Implementation. */
/* cpW file1 file2: Copy file1 to file2. */
#include <windows.h>
#include <stdio.h>
#define BUF_SIZE 16384 /* Optimal in several experiments. Small values such as 256 give very bad performance */
int main (int argc, LPTSTR argv [])
{
HANDLE hIn, hOut;
DWORD nIn, nOut;
CHAR buffer [BUF_SIZE];
if (argc != 3) {
fprintf (stderr, "Usage: cp file1 file2\n");
return 1;
}
hIn = CreateFile (argv[1], GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hIn == INVALID_HANDLE_VALUE) {
fprintf (stderr, "Cannot open input file. Error: %x\n", GetLastError ());
return 2;
}
hOut = CreateFile (argv[2], GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hOut == INVALID_HANDLE_VALUE) {
fprintf (stderr, "Cannot open output file. Error: %x\n", GetLastError ());
CloseHandle(hIn);
return 3;
}
while (ReadFile (hIn, buffer, BUF_SIZE, &nIn, NULL) && nIn > 0) {
WriteFile (hOut, buffer, nIn, &nOut, NULL);
if (nIn != nOut) {
fprintf (stderr, "Fatal write error: %x\n", GetLastError ());
CloseHandle(hIn); CloseHandle(hOut);
return 4;
}
}
CloseHandle (hIn);
CloseHandle (hOut);
return 0;
}



این خط رو متوجه نمیشم که حلقه چطور کار می کنه و اون &nIN و nIN>0 چه کاری رو انجام میدن!

while (ReadFile (hIn, buffer, BUF_SIZE, &nIn, NULL) && nIn > 0)
و اولین پارامتر تابعfprintf چه کاری رو انجام میده:
fprintf (stderr, "Fatal write error: %x\n", GetLastError ());

ممنون

fjm11100
چهارشنبه 03 مهر 1392, 19:51 عصر
اون حلقه میاد تابع readfile را اجرا میکنه. اگر عملیات خواندن با موفقیت انجام بشه true برمیگردونه و تعداد بایتهای خوانده شده از فایل را هم در آدرس متغیر nIn میزاره(علامت & مربوط به آدرس این متغیر میشه مبحث پوینترها و call by reference را بخون) حالا اگه شرط اول اوکی بود شرط دوم بررسی میشه که تعداد بایتهای خوانده شده را چک میکنه که بیشتر از صفر باشه(یعنی حلقه تا آخرین بایت فایل تکرار میشه تا دیگه بایتی نمونه)
اینم جواب سوال دوم (http://www.cplusplus.com/reference/cstdio/stderr/)

مصطفی ساتکی
چهارشنبه 03 مهر 1392, 20:18 عصر
nIn پارامتر خروجی که تعداد بایت های خوانده شده را بر می گردونه به طور مثال شما اندازه بافر رو 100 مشخص کردید و در نزدیکی انتهای فایل هستید و فقط 80 بایت باقی مونده در این موقع وقتی که عملیات Read رو انجام میدید nIn با 80 ست شده بجای 100. در مواردی که در انتهای فایل هم باشید nIn =0 میشه که اون شرط برای اینکار هستش یعنی تا زمانیکه nIn بزرگتر از صفر هست ادامه بده.
fprintf برای write کردن در فایل هستش از آنجایی که stderr هم فایل هستش برای نمایش خطا از این دستور استفاده میشه و GetLasError هم کد آخرین خطای اتفاق افتاده را بر می گردونه.

mhabat
چهارشنبه 03 مهر 1392, 23:06 عصر
آهان! خیلی عالی.

الان ما که اومدیم از طریق حلقه کل فایل رو read کردیم , 1-چطور می تونیم کاری کنیم که همون فایل read شده رو واسمون چاپ کنه؟ یعنی دیگه write نکنه بلکه همون فایل رو واسمون چاپ کنه مقادیرشو(

بر فرض یک فایل text)

مشکل اینجاست که تابعreadfile یه تایع بولی هست و نمیشه چاپش کرد! و نمی دونم باید چی کار کنم!

2-این خط رو ببینید:

WriteFile (hOut, buffer, nIn, &nOut, NULL);
خوب پارامتر اول که آدرس فایل ,پارامتر دوم آدرس بافر ,پارامتر سوم سایز بافر و پارامتر چهارم هم تعداد بایت write کرده رو مشخص می کنه.

حالا سوال اینجاست که این تابع چه چیزی رو میخواد write کنه! ما که مقداری بهش ندادیم! هیچ کدوم از پارامتر های تایع writefile مقادیر readfile نگرفتند

و این واسه من مبهمه!

ممنون

UfnCod3r
پنج شنبه 04 مهر 1392, 07:25 صبح
شما که خودت داری می گی بافر رو تو فایل ذخیره می کنه .
اول با ReadFile از فایل اطلاعات رو ریختی تو بافر بعد هم با WriteFile بافر رو ریختی تو فایل .
معلومه که کد ها رو درجا کپی کردی .:عصبانی++:

mhabat
پنج شنبه 04 مهر 1392, 10:02 صبح
من یه ذهنیت غلطی داشتم.ممنون.

اینو ببینید:

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#define BUF_SIZE 16384
int main (int argc, LPTSTR argv [])
{
HANDLE hIn;
DWORD nIn;
CHAR buffer [BUF_SIZE];

hIn = CreateFile (argv[1], GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);


while (ReadFile (hIn, buffer, BUF_SIZE, &nIn, NULL) && nIn > 0) {

printf(buffer);
}
CloseHandle (hIn);
return 0;
}

الان buffer رو printf کردم و برنامه هیچ اروری هم نمیده! ولی کار نمی کنه!

mhabat
پنج شنبه 04 مهر 1392, 23:21 عصر
بافر رو پرینت می کنم ولی کار نمی کنه!
لطفا راهنمایی کنید

UfnCod3r
جمعه 05 مهر 1392, 08:18 صبح
تابع printf رو درست استفاده نکردی. دقت کن.