圧縮・伸張ソフトで解凍後、ファイルを開くとエラー – プログラミング – Home

圧縮・伸張ソフトで解凍後、ファイルを開...
 
通知
すべてクリア

[解決済] 圧縮・伸張ソフトで解凍後、ファイルを開くとエラー


gzip
 gzip
(@gzip)
ゲスト
結合: 16年前
投稿: 3
Topic starter  

よろしくおねがいします。
「Gzip for Windows」( http://gnuwin32.sourceforge.net/packages/gzip.htm)
という、windows用のgzip形式のファイルを圧縮、伸張するソフトを利用して、ファイル
処理を行いたいのですが、
圧縮ファイルを解凍して、解凍後のファイルをオープンしようとすると
正常に解凍されているにも関わらず、ファイルを開くことが出来ません
一旦、プログラムを終了して、予め解凍後のファイルが存在する状態で、2回目を実行す
ると成功するのですが、これでは使い物になりません、間違い、錯誤等ご教示願えません
でしょうか。

補足
尚、解凍ソフトに、「解凍レンジ」( http://www.vector.co.jp/soft/win95/util
/se094501.html)
を利用して、似たようなプログラムを書いても、同様の問題が発生します。

#include <stdio.h>
#include <windows.h>
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main(int argc, char* argv[])
{
ShellExecute(NULL, (LPCSTR)open, gunzip, c:\\mail\\analysis.log.gz, NULL,
SW_HIDE);
string oneline;
fstream open_file(c:\\mail\\analysis.log, ios::in);

if(open_file.fail()) {
cout << file open error!! << endl;
return 1;
}

while( getline(open_file, oneline) ) {
cout << oneline << endl;
}
return 0;
}


引用未解決
トピックタグ
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

ShellExecute(NULL, (LPCSTR)open, gunzip, c:\\mail\\analysis.log.gz, NULL,
SW_HIDE);

ShellExecuteの処理がまだ完了しないうちに、オープンしてるのでは?
ShellExecuteExあたりでプロセスハンドルをつかんで、
WaitForSingleObjectとかで終了待ちしてみるとどうなります?


返信引用
gzip
 gzip
(@gzip)
ゲスト
結合: 16年前
投稿: 3
Topic starter  

Banさんお世話になります。
アドバイスを参考に、過去ログ等検索して、見よう見まねでこのように実装して見ました
が、自信がありません。
Banさんをはじめ、皆様方へお願いですが
間違い、私の錯誤等ございましたら、引き続きご教示願います。
#include <stdio.h>
#include <windows.h>
#include <iostream>
#include <fstream>
#include <string>

using namespace std;
BOOL WaitGzip();
int main(int argc, char* argv[])
{
if(WaitGzip()) {
string oneline;
fstream open_file(c:\\mail\\analysis.log, ios::in);

if(open_file.fail()) {
cout << file open error!! << endl;
return 1;
}
while( getline(open_file, oneline) ) {
cout << oneline << endl;
}
return 0;
}
}

BOOL WaitGzip()
{
char *pszWork1 = gunzip;

//Gzipを起動する
ShellExecute(NULL, (LPCSTR)open, pszWork1, c:\\mail\\analysis.log.gz, NULL,
SW_HIDE);
//初期化
SHELLEXECUTEINFO sei = { 0 };
//構造体のサイズ
sei.cbSize = sizeof(SHELLEXECUTEINFO);
//起動側のウインドウハンドル
//sei.hwnd = m_hWnd;
//起動後の表示状態
sei.nShow = SW_SHOWNORMAL;
//メインプログラムを待機パラメータ
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
//起動プログラム
sei.lpFile = (LPCSTR)pszWork1;
//プロセス起動
if(!ShellExecuteEx(&sei) || (const int)sei.hInstApp <= 32){
cerr << error ShellExecuteEx << endl;
return FALSE;
}
//終了を待つ
WaitForSingleObject( sei.hProcess, INFINITE ) ;
return TRUE;
}


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

Ex使うときは、ShellExecuteをShellExecuteExにしてください。
 つまり、既存のShellExecute自体は要らない

で、ShellExecuteで指定してたものは、Exの方にも反映してください。
 SW_HIDE⇒SW_SHOWNORMALに変わってますが意図通りですか?とか、
 verbなくなってますけど?とか。

あと、取ったハンドルはちゃんと閉じてください。
MSDN
The calling application is responsible for closing the handle when it is no
longer needed.


返信引用
gzip
 gzip
(@gzip)
ゲスト
結合: 16年前
投稿: 3
Topic starter  

Ban さん、お世話になります。
ご指摘、ご指導ありがとうございます。
このように修正してみました、解決とさせて頂きたいと思います。

#include <stdio.h>
#include <windows.h>
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

BOOL WaitGzip();

int main(int argc, char* argv[])
{
if(WaitGzip()) {
string oneline;
fstream open_file(c:\\mail\\analysis.log, ios::in);

if(open_file.fail()) {
cout << file open error!! << endl;
return 1;
}
while( getline(open_file, oneline) ) {
cout << oneline << endl;
}
}
return 0;
}

BOOL WaitGzip()
{
//外部起動プログラム名
const char *pszWork1 = gunzip;
//パラメータ
const char *pszFpath = c:\\mail\\access_log.1.gz;

//初期化
SHELLEXECUTEINFO sei = { 0 };
//構造体のサイズ
sei.cbSize = sizeof(SHELLEXECUTEINFO);
//起動後の表示状態
sei.nShow = SW_HIDE;
//メインプログラム待機設定パラメータ
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
//起動モード
sei.lpVerb = open;
//外部起動プログラム
sei.lpFile = (LPCSTR)pszWork1;
//パラメータ
sei.lpParameters = (LPCSTR)pszFpath;
//プロセス起動
if(!ShellExecuteEx(&sei) || (const int)sei.hInstApp <= 32) {
cerr << error ShellExecuteEx << endl;
return FALSE;
}
//終了を待つ
WaitForSingleObject( sei.hProcess, INFINITE );
//ハンドルを閉じる
::CloseHandle(sei.hProcess);
return TRUE;
}


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました