Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

7zip binarka - przekierowanie wyjścia do pliku

Ostatnio zmodyfikowano 2016-10-21 15:21
Autor Wiadomość
mikson
Temat założony przez niniejszego użytkownika
7zip binarka - przekierowanie wyjścia do pliku
» 2016-10-19 16:01:58
Witajcie,

Moim problemem jest przekierowanie wyjścia z pliku binarnego 7zip o nazwie 7za.exe do pliku txt. To, co wpisuję w cmd wygląda tak:
7za.exe h "C:\Users\Mikołaj\Desktop\plik.7z" -so >"C:\Users\Mikołaj\Desktop\test.txt"

W moim zamyśle 7za.exe miałoby po prostu wypisać CRC32 pliku plik.7z do test.txt. Po wywołaniu całości test.txt jest nadal pusty, natomiast bez parametru -so wypisywanie działa, ale do konsoli. Ktoś ma pomysł jak to rozwiązać? Z góry dziękuję.
P-152641
j23
» 2016-10-20 11:09:59
Według dokumentacji przełącznik -so działa tylko z niektórymi typami archiwów, .7z do nich nie należy.
P-152670
mikson
Temat założony przez niniejszego użytkownika
» 2016-10-21 08:59:08
Problem rozwiązany - prawidłowo powinno się to wywoływać tak:
7za.exe h "C:\Users\Mikołaj\Desktop\file.7z" > "C:\Users\Mikołaj\Desktop\test.txt"

I wówczas wszystko działa. Kolejny problem pojawia się, gdy chcę zrobić wszystko jak wyżej, ale zaimplementowane do C++. Robię to w następujący sposób:
C/C++
SHELLEXECUTEINFO seinfo;
ZeroMemory( & seinfo, sizeof( SHELLEXECUTEINFO ) );
seinfo.cbSize = sizeof( SHELLEXECUTEINFO );
seinfo.fMask = SEE_MASK_NOCLOSEPROCESS;
seinfo.lpDirectory = TEXT( Is64BitWindows() ?( ExePath() + "\\bin\\7zip\\x64\\" ).c_str()
    :( ExePath() + "\\bin\\7zip\\" ).c_str() ); //lokalizacja 7zip w zaleznosci od ilosci bitow w systemie
seinfo.lpFile = TEXT( "7za.exe" );
seinfo.lpParameters = TEXT( "h C:\\Users\\Mikołaj\\Desktop\\file.7z > C:\\Users\\Mikołaj\\Desktop\\test.txt" ); //parametry dla 7zip
seinfo.nShow = SW_SHOWNORMAL;
ShellExecuteEx( & seinfo );

Niestety, ale wszystko wywołuje się, ale znów wypisuje się do konsoli zamiast do pliku txt. Jest to o tyle dziwne, że w obydwu przypadkach podaje te same argumenty, tyle że dla cmd lub ShellExecute, a działa zupełnie inaczej. Co może być tego przyczyną?
P-152716
j23
» 2016-10-21 10:54:08
Może to, że operator przekierowania jest dla interpretera poleceń cmd. Użyj funkcji system lub spróbuj takiego wywołania: cmd.exe /C 7za.exe h "C:\Users\Mikołaj\Desktop\file.7z" > "C:\Users\Mikołaj\Desktop\test.txt". W ostateczności pozostaje CreateProcess z przekierowanymi strumieniami (możesz użyć uchwytów do plików).


P-152719
mikson
Temat założony przez niniejszego użytkownika
» 2016-10-21 11:42:12
Z system() działa, ale wada tego jest taka, że niestety nie mogę wyciągnąć kodu zwracanego od 7zipa, a co za tym idzie, tylko po pliku txt mogę ocenić, czy wszystko poszło OK.

P.S. Słyszałem, że funkcji system() raczej powinno się unikać i dotąd nie używałem jej w projekcie - dlaczego?
P-152720
Rashmistrz
» 2016-10-21 12:12:50
system() działa, ale wada tego jest taka, że niestety nie mogę wyciągnąć kodu zwracanego od 7zipa
Przecież system() zwraca %errorlevel%, który jest
wartością typu
int
 zwróconą z funkcji main() przez program.
Co za problem?
P-152721
mikson
Temat założony przez niniejszego użytkownika
» 2016-10-21 12:37:28
Ok, to jeszcze ostatnie pytanie a propos system() - da się jakoś to uruchomić "w ukryciu" albo zminimalizować? Wyświetlanie nagle czarnego okna może przestraszyć użytkownika :P A tak poważnie, wyglądałoby po prostu estetyczniej.
P-152722
j23
» 2016-10-21 14:35:12
http://cpp0x.pl/forum/temat/?id=22758 <--- tutaj podałem funkcję, która działa podobnie jak system. Dostosuj ją do swoich potrzeb.
P-152723
« 1 » 2
  Strona 1 z 2 Następna strona