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ę. |
|
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. |
|
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: 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() ); seinfo.lpFile = TEXT( "7za.exe" ); seinfo.lpParameters = TEXT( "h C:\\Users\\Mikołaj\\Desktop\\file.7z > C:\\Users\\Mikołaj\\Desktop\\test.txt" ); 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ą? |
|
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).
|
|
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? |
|
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? |
|
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. |
|
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. |
|
« 1 » 2 |