ورود

View Full Version : پاک کردن فایل در حال اجرا



delphi5
سه شنبه 23 بهمن 1386, 10:00 صبح
چطور میشه یه EXE رو وقتی که اجرا شده پاک کرد و بجای اون یه فایل جدید رو کپی کرد .

vcldeveloper
سه شنبه 23 بهمن 1386, 11:49 صبح
با تابعMoveFileEx


MoveFileEx(szDstFile, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
MoveFileEx(szSrcFile, szDstFile, MOVEFILE_DELAY_UNTIL_REBOOT);

کد بالا فایل szDstFile را در ریست بعدی سیستم حذف میکنه و فایل szSrcFile را با آن جایگزین میکنه. توضیحاتش در Windows SDK اومده. این مثال هم از همونجا ست.

dkhatibi
سه شنبه 23 بهمن 1386, 12:47 عصر
احتمالا شما می خواید ورزن برنامه را Update کنید. پس با این تابع مشکل قبلی شما حل شد.

delphi5
پنج شنبه 25 بهمن 1386, 16:17 عصر
s1:=phone.exe';
s2:='c:\phone.exe';
pat:='';
pat:= GetCurrentDir;
pat:=pat+'\phone.exe';
MoveFileEx(pchar(pat),'', MOVEFILE_DELAY_UNTIL_REBOOT);
MoveFileEx(pchar(s2),pchar(pat),MOVEFILE_DELAY_UNT IL_REBOOT);
ShowMessage('Please reboot your system ');






پس از بوت شدن سیستم هیچ تغییری ایجاد نمی شود . با این کار من قصد update کردن ورژن اجرائی رو دارم .
مشکل رو میتونید حدس بزنید ؟

vcldeveloper
پنج شنبه 25 بهمن 1386, 17:42 عصر
اگه Pat مسیر فایل برنامه رو نگه داری میکنه:
pat := Application.ExeName

delphi5
شنبه 27 بهمن 1386, 08:51 صبح
اگه Pat مسیر فایل برنامه رو نگه داری میکنه:
pat := Application.ExeName

متوجه منظورتون نمی شم .

delphi5
شنبه 27 بهمن 1386, 09:40 صبح
s2:=مسیر فایل جدید ;
pat:='';
pat:= ExtractFilePath(Application.ExeName);
pat:=pat+'\phone.exe';
MoveFileEx(pchar(pat),'', MOVEFILE_DELAY_UNTIL_REBOOT);
MoveFileEx(pchar(s2),pchar(pat),MOVEFILE_DELAY_UNT IL_REBOOT);
ShowMessage('Please reboot your system ');





این عمل نمیکنه . میدونید چرا ؟

Mah6447
شنبه 27 بهمن 1386, 10:17 صبح
کد زیر را تست کردم و جواب داد . موفق باشید ....


pat:= Application.ExeName;
pat2:='مسیر فایل جدید'+'Phone.exe';
MoveFileEx(pchar(pat),pchar(pat2), MOVEFILE_REPLACE_EXISTING);
ShowMessage('Please reboot your system ');

delphi5
شنبه 27 بهمن 1386, 12:42 عصر
کد زیر را تست کردم و جواب داد . موفق باشید ....


pat:= Application.ExeName;
pat2:='مسیر فایل جدید'+'Phone.exe';
MoveFileEx(pchar(pat),pchar(pat2), MOVEFILE_REPLACE_EXISTING);
ShowMessage('Please reboot your system ');




من نتیجه نگرفتم :ناراحت:

Mah6447
شنبه 27 بهمن 1386, 13:15 عصر
توضیح بیشتری بدید که چکاری انجام دادید که نشد ؟

delphi5
شنبه 27 بهمن 1386, 13:40 عصر
pat:=Application.ExeName;
pat2:=c:\phone.exe';
MoveFileEx(pchar(pat),pchar(pat2),MOVEFILE_DELAY_U NTIL_REBOOT);
ShowMessage('Please reboot your system ');



pat ادرس فایل اجرائی را در خود ذخیره میکند
pat2 آدرس فایل جدید که می بایست با فایل اجرا شده تعویض گردد را در خود ذخیره میکند .
با این کار من قصد update کردن ورژن اجرائی رو دارم .
اگر راه دیگری هم بنظرتون میرسه خواهش میکنم راهنمائی کنید .

با تشکر

Mah6447
شنبه 27 بهمن 1386, 13:52 عصر
بجا MOVEFILE_DELAY_UNTIL_REBOOT کد MOVEFILE_REPLACE_EXISTING قرار دهید .

delphi5
شنبه 27 بهمن 1386, 14:03 عصر
بعد نیازی به reboot شدن سیستم دارم یا خیر ؟

Mah6447
شنبه 27 بهمن 1386, 14:11 عصر
سیستم نیاز به reboot ندارد . فقط کافیست برنامه را ریستارت کنید .

delphi5
شنبه 27 بهمن 1386, 14:12 عصر
جالبه . باز هم جواب نداد . لازم به توضیح است که برنامه اجرا شده است . یعنی امکان replace وجود ندارد

Mah6447
شنبه 27 بهمن 1386, 14:38 عصر
فایل زیر را دریافت و باز کنید . ابتدا فایل Oldver.exe را اجرا کنید . به ظاهر آن توجه کنید. Project2.exe فایل جدید می باشد و Oldver.exe فایل قدیم . Project2.exe را اجرا و کلید آپدیت را بزنید حال پوشه برنامه را نگاه کنید . خواهید دید که فایل Project2.exe وجود ندارد . حال فایل Oldver.exe را اجرا کنید . چه می بینید ? البته ببخشید که جملات دستوری شد .

delphi5
شنبه 27 بهمن 1386, 14:45 عصر
فایل خراب است :(

Mah6447
شنبه 27 بهمن 1386, 14:53 عصر
دوباره آزمایش کن فایل را دوبار در همان پست Attach کردم . موفق باشید ...

delphi5
شنبه 27 بهمن 1386, 15:17 عصر
با تشکر از لطف شما
اما اشتباه کردید .
من دو تا فایل دارم
pat و pat2
pat اجرا میشود . pat2 را از روی سرور بروی دستگاه دانلود میکند و با pat جایگزین میکند . و نهایتا pat2 فایل جدید میشود .شما فایلی که اجرا نشده بود را عوض کردید

delphi5
شنبه 04 اسفند 1386, 15:52 عصر
کسی نمیتونه در این مورد کمکم کنه ؟

dkhatibi
یک شنبه 05 اسفند 1386, 14:08 عصر
فرض کنید نام برنامه ی اصلی A هست این برنامه باید Update شود. فایل جدید بر روی دستگاه منتقل می شود . نام آن را B بگذارید.
یک فایل برنامه به نام C بسازید. کار این فایل اینه که چک می کند آیا B وجود دارد یا نه.
سپس برنامه پس از انتقال فایل B فایل C را اجرا کرده و خودش فایل A بسته می شود.(terminate)
فایل C اجرا شده و چک می کند...
در صورت وجود B فایل A را پاک می کند. ابتدا B را به A تغییر نام می دهد و سپس B قبلی که الان A شده را اجرا می کند.
خودفایل C نیز Terminate می شه!
با کمک یک فایل جانبی کاری که شما می خواهید شدنی است.

delphi5
دوشنبه 06 اسفند 1386, 09:47 صبح
حرف شما صحیح . اما من قصد دارم بدون نیاز به کاربر برنامه رو update کنم . شما لطف کردید و توضیح دادید اما اصل قضیه فرق میکنه . البته من به ابن نتیجه رسیدم که بایستی

برنامه اصلی اجرا شود .
چک کند که ورژن جدید موجود است یا خیر
در صورت وجود به کاربر پیغام update نشان داده شود .
برنامه دانلود شود
برنامه کمکی اجرا شود
برنامه اصلی از اجرا خارج شود
update برنامه .
اجرای برنامه اصلی
خروج برنامه کمکی

dkhatibi
دوشنبه 06 اسفند 1386, 11:02 صبح
خوب پس همه چیز حله نه؟!!

delphi5
دوشنبه 06 اسفند 1386, 12:02 عصر
مشکل اینجاست
اگه یه برنامه رو از توی برنامه ام صدا برنم و بعد برنامه ام رو terminate کنم میشه ؟

dkhatibi
دوشنبه 06 اسفند 1386, 17:46 عصر
اون برنامه خودش داره کار خودشو می کنه .
پس از اجرا برنامه ی خودتون رو terminate کنید و هیچ مشکلی هم نیست.