View Full Version : کپی با توابع سطح پایین
mehran_337
سه شنبه 04 اردیبهشت 1386, 13:19 عصر
در برنامه کاربر باید اجازه داشته باشد فایلهای خود را روی سرور شبکه آپلود کند.
مسیر فایل ها و حتی نام فایل هم ممکن است حاوی space باشد. مثل
my folder\my file.doc
دستور copy file to فاکس با مسیر اینچنینی مشکل پیدا می کند و خطا می گیرد.
در ذهنم بود که باتوجه به توابع سطح پایین فایل را بایت به بایت خوانده و در فایلی جدید کپی نماید با این دستور
file1 ="E:\my programs\rep 86.doc"
file2 = "d:\a1.doc"
OLD = FOPEN(file1)
f2 = FCREATE(file2)
DO WHILE .NOT. FEOF(OLD)
REC = CHRTRAN(FGETS(OLD), CHR(12), CHR(32))
=FWRITE(f2,rec)
ENDDO
= FCLOSE(OLD)
= FCLOSE(f2)
1- روش خوبی انتخاب کردم ؟ یا روش های دیگری پیشنهاد می کنید.
2 - اشکال کد فوق چیست؟
binyaz2003
سه شنبه 04 اردیبهشت 1386, 17:28 عصر
سلام
با نگاهی که به راهنمای فاکس پرو در مورد دستور delete file انداختم متوجه مشکل فاصله در این دستورات از جمله copy file شدم البته راه حل رو هم نوشته بود.
کافیست نام و آدرس فایل را میان " قرار دهید مثلا :
"copy file "a b c.txt" to "d:\a b c.txt
javad_hosseiny
سه شنبه 04 اردیبهشت 1386, 17:39 عصر
دستور copy file to فاکس با مسیر اینچنینی مشکل پیدا می کند و خطا می گیرد.
اگر رشته موردنظر را توسط کاراکتر " محصور نمایید مشکلی به وجود نمی آید.
مثل:
file1 = '"c:\my document\ my picture.jpg"'
file2 = '"d:\my picture.jpg"'
copy file &file1 to &file2
حالا نهایتا فرض بر این بگیریم که جایی نیاز به کپی و یا یکسری عملیات بر روی فایل دارید در صورتی که محدودیتی برای حجم فایلها دارید (مثلا زیر دو مگابایت یا ...) پیشنهاد می کنم که به یکبار توسط دستور filetostr و strtofile از فایل مبدا خوانده و در فایل مقصد بنویسید
و اگر اینچین نبود می توانید در یک حلقه do while مشابه حلقه فوق (در کدنویسی خودتان) می توانید اینکار را انجام دهید ولی پیشنهاد می کنم به جای استفاده از fgets از دستور fread استفاده نمایید. و در دستور fread مثلا سعی کنید حداقل 1 مگابایت به یک مگابایت اطلاعات را بخوانید (جهت افزایش سرعت خواندن و ....)
و البته از دستور fgets (و متناسبا fputs) بیشتر در مورد فایلهای تکست و ... بیشتر استفاده می شود. (مخصوصا در تبدیل فایلها (تکست و وب و ...) و یا سرچ در متن و ...)
rezaTavak
چهارشنبه 05 اردیبهشت 1386, 07:55 صبح
Declare long CopyFile IN "kernel32.dll" Alias "CopyFileA" String, String, Long
از این تابع ویندوز هم می توانید استفاده کنید.
mehran_337
چهارشنبه 05 اردیبهشت 1386, 08:40 صبح
از همه دوستان ممنونم .
جناب حسینی عزیز !
روشی که برای خواندن محتویات فایل انتخاب کرده بودم بیشتر به این خاطر بود که بتوانم روند کپی را توسط پروگرسبار نشان بدهم.
اما همانطوریکه عرض کردم در ارتباط با توابع سطح پایین .... بگذریم . خب دیگه چه خبر!
اگر برای شما مقدوره تکه کدی که درون حلقه کار فوق را انجام می دهد اینجا بزارید ممنون می شم.
جناب توکل !
دستور جالبی بود اما بصورت
copyfile(file1,file2)
استفاده کردم اما پیغام too many argument میده.
javad_hosseiny
چهارشنبه 05 اردیبهشت 1386, 12:00 عصر
یک نمونه سورس قدیمی تحت داس داشتم مشابه NC (norton commander برای مدیریت فایل در محیط داخلی برنامه ام بود. من جمله کارهایی که انجام می داد کپی یا جابجایی یا ... با قابلیت نمایش توسط پروگرس بار روتین موردنظر را آنجا می تونید پیدا کنید (با استفاده از توابع سطح پایین فایل کار می کرد و مشابه خواسته شما هر چقدر که می خواند یا کپی می کرد توسط یک پروگرس بار (البته در محیط داس و به صورت شبیه سازی شده) روند پیشرفت عملیات را نمایش می داد)
-------------
(می بخشید فراموش کرده بودم فایل رو ضمیمه کنم)
mehran_337
چهارشنبه 05 اردیبهشت 1386, 12:55 عصر
خب ممنون می شه بگید این کجاست؟؟
rezaTavak
چهارشنبه 05 اردیبهشت 1386, 20:33 عصر
DECLARE INTEGER CopyFile IN kernel32;
STRING lpExistingFileName,;
STRING lpNewFileName,;
INTEGER bFailIfExists
? CopyFile("C:\Autoexec.bat", "C:\Autoexec.cpy", 0)
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.