PDA

View Full Version : باز هم winrar ولی یک اشکال کوچک



vjp
چهارشنبه 05 بهمن 1384, 09:32 صبح
سلام
من تابع نوشته شده برای فشرده سازی فایل ها از طریق winrar را در سایتی پیدا کرده ام که البتهfreeware است و آدرس آن هم:
http://www.delphipages.com/threads/thread.cfm?ID=99019&G=98999
و خود تابع به صورت زیر


Function RarIt(sArcivename, SLocation, DLocation: String; bdel_after: Boolean):
Boolean;
Var
s1: String;
H: HWND;
Begin

If Length(SLocation) = 0 Then
exit
Else
Begin

If Length(DLocation) = 0 Then
DLocation := SLocation;

If bdel_after = true Then
s1 := 'm'
Else
s1 := 'a';

If ShellExecute(H,
Pchar('Open'),
Pchar('WinRar.exe'),
Pchar(s1 + '-r -o+ -rr ' + '"' + DLocation + sArcivename + '" "' +
SLocation + '*.*"'),
Pchar(DLocation),
SW_NORMAL) <= 32 Then
Begin
Result := False;
End
Else
Result := True;

End;

End;

مشکل من این است که وقتی فایلی را در مسیر دلخواهی توسط این تابع فشرده میکنم فایل آرشیو بدست آمده دارای زیرشاخه هایی است که فایل اصلی در آن مسیر قرار داشته در صورتیکه من تمایل دارم در فایل فشرده شده فقط فایل من بدون وجود هیچ پوشه ای موجود باشد اگر ممکن است راهنمایی کنید چونکه در مورد پارامترهای توابع API زیاد آشنایی ندارم در ضمن برای باز کردن فایل آرشیو از چه پارامتری استفاده کنم؟ با تشکر

Hamid_PaK
چهارشنبه 05 بهمن 1384, 21:16 عصر
دوست عزیز ابتدا مسیر رو انتخاب کنید و بعد کامند مورد نظر رو اجرا کنید ...



begin
SetCurrentDir('your own dir path');
WinExec(pChar('"path of the winrar folder\Rar.exe" a aRAR-Packed.rar ./'),SW_HIDE);
end;


یا حق !!!

vjp
پنج شنبه 06 بهمن 1384, 11:49 صبح
با تشکر از راهنمایی شما
من از تابع SetCurrentDir که شما معرفی کردید در همین فانکشن خودم استفاده کردم که از تابع Shellexecute استفاده شده بود و مشکلم حل شد حال یک سؤال دیگر: چگونه میتوانم از چنین تابعی برای Extract نمودن فایل آرشیو شده استفاده کنم؟ با تشکر

Hamid_PaK
پنج شنبه 06 بهمن 1384, 14:43 عصر
var
extPath,rarPath,wRarPath: String;
begin
wRarPath := 'C:\Program Files\WinRAR\Rar.exe';
rarPath := 'path of your rar archive must add here.rar';
extPath := 'c:\extractedFileFromRAR-Archive\';
if not ForceDirectories(extPath) then
begin
MessageBox(GetDesktopWindow,'Error to make the extract path ...','Error',MB_ICONEXCLAMATION);
Exit;
end;
SetCurrentDir(extPath);
WinExecAndWaitNoFreeze(pChar(ExtractShortPathName( wRarPath)+' e '+ExtractShortPathName(rarPath)),SW_HIDE);
MessageBox(GetDesktopWindow,pChar('Rar archive extracted to '+QuotedStr(extPath)+' successfully ...'),'Error',MB_ICONINFORMATION);



یا حق !!!

vjp
شنبه 08 بهمن 1384, 09:09 صبح
ببخشید این تابع WinExecAndWaitNoFreeze به نظر نمی آید که از توابع API باشد اگر هست لطفاً Unit آن را معرفی کنید چونکه error میدهد با تشکر

Hamid_PaK
شنبه 08 بهمن 1384, 23:10 عصر
این تابع ای هست که فکر می کنم از سایت خارجی من پیدا کرده بودم اینم ... باعث میشه تا انتهای انجام دیکمپرس برنامه صبر کنه و بعد از تابع خارج بشه ...



function WinExecAndWaitNoFreeze(const FileName:String; const CmdShow:Integer):Longword;
var { by Pat Ritchey }
zAppName: array[0..512] of Char;
zCurDir: array[0..255] of Char;
WorkDir: string;
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
//AppIsRunning: DWORD;
begin
StrPCopy(zAppName, FileName);
GetDir(0, WorkDir);
StrPCopy(zCurDir, WorkDir);
FillChar(StartupInfo, SizeOf(StartupInfo), #0);
StartupInfo.cb := SizeOf(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := CmdShow;
if not CreateProcess(nil,
zAppName, // pointer to command line string
nil, // pointer to process security attributes
nil, // pointer to thread security attributes
False, // handle inheritance flag
CREATE_NEW_CONSOLE or // creation flags
NORMAL_PRIORITY_CLASS,
nil, //pointer to new environment block
nil, // pointer to current directory name
StartupInfo, // pointer to STARTUPINFO
ProcessInfo) // pointer to PROCESS_INF
then Result := WAIT_FAILED
else
begin
while WaitForSingleObject(ProcessInfo.hProcess, 0) = WAIT_TIMEOUT do
begin
Application.ProcessMessages;
Sleep(50);
end;
{
// or:
repeat
AppIsRunning := WaitForSingleObject(ProcessInfo.hProcess, 100);
Application.ProcessMessages;
Sleep(50);
until (AppIsRunning <> WAIT_TIMEOUT);
}

WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
GetExitCodeProcess(ProcessInfo.hProcess, Result);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
end;
end; { WinExecAndWait32 }


یا حق !!!

vjp
یک شنبه 09 بهمن 1384, 13:33 عصر
با تشکر از راهنمایی های شما آقای حمید:
راستی کامپوننتی را هم در این مورد از سایت زیر دانلود کرده ام بنام Zipforge که بد نیست امتحانش کنید
http://www.componentace.com

Hamid_PaK
یک شنبه 09 بهمن 1384, 22:24 عصر
باهاش کار کردم ... به هر حال اگه بازم به چیز جالبی برخوردی خبرم کن ، همیشه منتظرم ...

یا حق !!!

asdfghjkl
یک شنبه 12 آذر 1385, 16:46 عصر
سلام من از این کد برای فشرده سازی استفاده کردم ولی مشکل اینجاست که فقط فایلهای داخل شاخه مورد نظر را فشرده می کند و فولدرهای داخل آن را فشرده نمی کند.
لطفا مرا راهنمایی کنید

rainstorm
چهارشنبه 11 اردیبهشت 1387, 11:33 صبح
سلام من از این کد برای فشرده سازی استفاده کردم ولی مشکل اینجاست که فقط فایلهای داخل شاخه مورد نظر را فشرده می کند و فولدرهای داخل آن را فشرده نمی کند.
لطفا مرا راهنمایی کنید
دوست عزیز کد Vjp یه اشکال کوچولو داره، اولاً تو خط
SLocation + '*.*"'),
*.* رو پاک کن، حال اگه آخر آدرس منبع (SLocation) بک اسلش بذاری فقط فایل های داخل پوشه رو آرشیو میکنه اگه بک اسلش نذاری خود پوشه رو با تمام محتویاتش اهم از فایل و پوشه آرشیو میکنه.
یک نمونه برنامه هم برات میذارم
منتهی مشکلی رو که vjp به آن اشاره نمودند رو داره، :متفکر:چک نکردم چطوری میشه مشکل رو برطرف کرد دوستان یه زحمت بکشن و حل کنن و فایل اطلاح شده رو ضمیمه کنند.

B-Vedadian
چهارشنبه 11 اردیبهشت 1387, 14:57 عصر
تابع مورد استفاده شما، خود WinRar رو صدا میزنه، بنا براین تمامی قابلیت های command prompt این برنامه در اختیار شماست. برید تو Help مربوط به WinRar تمامی switch ها و پارامترهایی که لازمه از جمله ذخیره کردن آدرس زیرشاخه ها، اضافه کردن زیرشاخه ها و ... رو تو اون پیدا می کنید. (ساختن فایلهای SFX هم از همین جملست)

rainstorm
شنبه 14 اردیبهشت 1387, 11:56 صبح
تابع مورد استفاده شما، خود WinRar رو صدا میزنه، بنا براین تمامی قابلیت های command prompt این برنامه در اختیار شماست. برید تو Help مربوط به WinRar تمامی switch ها و پارامترهایی که لازمه از جمله ذخیره کردن آدرس زیرشاخه ها، اضافه کردن زیرشاخه ها و ... رو تو اون پیدا می کنید. (ساختن فایلهای SFX هم از همین جملست)
ضمن تشکر از نکته ظریفی که اشاره کردین، من اینو امتحان کردم اما متأسفانه نفهمیدم کدوم سوئیچ فقط خود پوشه رو آرشیو می کنه یعنی پوشه های پدر رو آرشو نمیکنه
میشه بیشتر توضیح بدین
در ضمن ظاهراً اولویت قرار گیری سوئیچ ها نیز مهم بود

B-Vedadian
شنبه 14 اردیبهشت 1387, 12:31 عصر
Do not store the path entered in the command line.
Example:
all files and folders from the folder tmp will be added to the archive test, but the path in the archived names will not include 'tmp\'
WinRAR a -r -ep1 test tmp\*
This is equivalent to the commands:

cd tmp
WinRAR a -r ..\test
cd ..