■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(1(左):あまり役立たない - 5(右):大変役立った):
■ ページの共有:
[ サイト内検索 ]
カスタム検索
#23003-0
DOSのSortコマンドを使用するとうまくいかない・・・
教えてください。下のようなサブルーチンを実行するとエラーとなったり、
ならなくてもPrintでの書き込みが途中で終わったりしてしまいます。

実行している内容は下のようになっています。

1.aaa.txtを読み込み、bbb.txtに書き込み
2.DOSのSortコマンドを使用してbbb.txtのソート結果をccc.txtに書き込み
3.ccc.txtを読み込み、ddd.txtに書き込み
4.aaa.txtとccc.txtを削除
5.ddd.txtをaaa.txtにリネーム

Shellコマンドのせいだと思って調べてみたら、どうやらShellコマンドの場合は終了を待たずに
次の処理にいってしまうらしいのですが、本当でしょうか?
そうだとしたらきちんと終了させてから次の処理に進むようにする方法はどうすればいいのでしょうか?

お分かりになる方、よろしくお願いします。


------------------------------------------------------------------------------------------

Private Sub Command1_Click()
    Dim str         As String
    Dim strCmd      As String
    Dim strData     As String
    
    'ファイル読み込み
    Open "aaa.txt" For Input As #1
    Open "bbb.txt" For Output As #2
        Do While Not EOF(1)
            Line Input #1, str
               'aaa.txtをbbb.txtに書き込み
               Print #2,str
        Loop
    Close #1
    Close #2
   
    'DOSを使用してbbb.txtの内容をソートし,ccc.txtに書き込み
    strCmd = "cmd.exe /c sort < bbb.txt > ccc.txt"
    Shell strCmd, 1
    
    If FileLen("bbb.txt") = FileLen("ccc.txt") Then  '←"ここでファイルが見つかりません"のエラーがでたりします。
        Open "ccc.txt" For Input As #3
        Open "ddd.txt" For output as #4
            Do While Not EOF(3)
                Line Input #3, strData
                Print #4, strData      '"ここで書き込みできません"のエラーも出たりします。
                Print #4, data1 & data2 & text1.text
            Loop
    End If
    Close #3
    Close #4
    
    'ファイル名変更、ファイル削除処理
    Call rename_file           
    
    Unload Form A
   
End Sub
------------------------------------------------------------------------------------------'ファイル名を変更ファイル削除処理
Private Sub rename_file()   
    Kill "aaa.txt"           '←ここらへんでも上と同じようなエラーが出ます。
    Kill "ccc.txt"
    Name "ddd.txt" As "aaa.txt"
    Kill "ddd.txt"
End Sub

------------------------------------------------------------------------------------------



















#23004-0
RE#23003:DOSのSortコマンドを使用するとうまくいかない・・・
> 教えてください。下のようなサブルーチンを実行するとエラーとなったり、
> ならなくてもPrintでの書き込みが途中で終わったりしてしまいます。
> 
> Shellコマンドのせいだと思って調べてみたら、どうやらShellコマンドの場合は終了を待たずに
> 次の処理にいってしまうらしいのですが、本当でしょうか?
> そうだとしたらきちんと終了させてから次の処理に進むようにする方法はどうすればいいのでしょうか?
> 

Shellコマンドの終了を確認するのはWindows APIを使用します。
内容についてはインターネットで検索すると見つかると思います。
#検索サイト:Gogleで 「Shell VisualBasic」 をキーにして県s飼うしたら
#すぐに見つかりました。

最初に行っている処理はaaa.txtの内容をbbb.txtに複写したいんですよね?
それならVBの関数にFileCopyがあるのでそいつを使ったほうが早くて、プログラムも
見やすくなると思います。
 それと、ファイルのオープン時に#1とか#2と直接数値を設定するのは止めたほうが
良いと思います。必ずしも#1や#2が空いているファイル番号とは限らないので...。
空いてるファイル番号を知るには FreeFile関数でわかります。

以上の点を考慮してコーディングしなおすと次のようになります。


Option Explicit

Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long _
  , ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long _
  , lpExitCode As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Const PROCESS_QUERY_INFORMATION As Long = &H400

Private Data1 As String
Private Data2 As String
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Private Sub Command1_Click()

 Dim str As String
 Dim strCmd As String
 Dim strData As String
 Dim iRf1 As Integer                ' ファイル番号
 Dim iWf1 As Integer                ' ファイル番号
 Dim iRf2 As Integer                ' ファイル番号
 Dim iWf2 As Integer                ' ファイル番号
 Dim lProID As Long                 ' プロセスID
 Dim lProHandle As Long             ' プロセスハンドル
 Dim lExitCode As Long
 Dim lRet As Long


    'ファイル読み込み
'    iRf1 = FreeFile
'    Open App.Path + "\aaa.txt" For Input As #iRf1
'    iWf1 = FreeFile
'    Open App.Path + "\bbb.txt" For Output As #iWf1
'        Do While Not EOF(iRf1)
'            Line Input #iRf1, str
'            'aaa.txtをbbb.txtに書き込み
'            Print #iWf1, str
'        Loop
'    Close #iRf1
'    Close #iWf1
    FileCopy App.Path + "\aaa.txt", App.Path + "\bbb.txt"

    'DOSを使用してbbb.txtの内容をソートし,ccc.txtに書き込み
    strCmd = "cmd.exe /c sort < bbb.txt > ccc.txt"
'    strCmd = "c:\windows\notepad.exe"
    ' コマンドの実行
    lProID = Shell(strCmd, 1)
    ' 実行プロセスのハンドルを取得
    lProHandle = OpenProcess(PROCESS_QUERY_INFORMATION, True, lProID)
    Do
        ' 終了したか取得する
        lRet = GetExitCodeProcess(lProHandle, lExitCode)
        DoEvents
    Loop While lExitCode                    ' 終了の確認
    lRet = CloseHandle(lProHandle)          ' ハンドルを開放

    If FileLen(App.Path + "\bbb.txt") = FileLen(App.Path + "\ccc.txt") Then
        Open App.Path + "\ccc.txt" For Input As #iRf2
        Open App.Path + "\ddd.txt" For Output As #iWf2
        Do While Not EOF(iRf2)
            Line Input #iRf2, strData
            Print #iWf2, strData
            Print #iWf2, Data1 & Data2 & Text1.Text
        Loop
    End If
    Close #iRf2
    Close #iWf2

    'ファイル名変更、ファイル削除処理
    Call rename_file
    
    Unload FormA

End Sub
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Private Sub rename_file()


    Kill App.Path + "\aaa.txt"
    Kill App.Path + "\ccc.txt"
    Name App.Path + "\ddd.txt" As App.Path + "\aaa.txt"
    Kill App.Path + "\ddd.txt"

End Sub



#23005-0
RE#23004:DOSのSortコマンドを使用するとうまくいかない・・・
結局、aaa.txtをbbb.txtにBackUpして、aaa.txtをソート
したいのではありませんか?
だとすれば無駄が多すぎます。
プログラムの性能のほとんどは設計時に決まってしまいます。
コーディングの前にもう少し吟味したらいかがですか?
うまくやれば、終了まちの必要もありませんし、
ccc.txtやddd.txtも不要です。

それはそうと、つっこみをひとつ・・・

    Name App.Path + "\ddd.txt" As App.Path + "\aaa.txt"
    Kill App.Path + "\ddd.txt"

は変です。
#23007-0
RE#23005:DOSのSortコマンドを使用するとうまくいかない・・・
朝おきてから、そう言えばと気づいたのですが、

  iRf2 = FreeFile
  Open App.Path + "\ccc.txt" For Input As #iRf2
  iWf2 = FreeFile
  Open App.Path + "\ddd.txt" For Output As #iWf2        

じゃないと駄目ですね。
ふと、目が覚めて気づきました。

> それはそうと、つっこみをひとつ・・・    
>    Name App.Path + "\ddd.txt" As App.Path + "\aaa.txt"
>    Kill App.Path + "\ddd.txt"
> は変です。
>

ほんとだ...。 Killの時点では、ddd.txtは aaa.txtになってしまい
なくなってますね。

このページと関連する記事:
#10926-0「開く」と「名前を付けて保存」に関する質問2000-08-27(日) 22:46
#20778-0メモ帳の保存や開くを再現するには?2001-05-09(水) 14:44
#6986-0ディレクトリ検索方法2000-03-29(水) 17:33
#22170-0テキストファイルの1行読み取り2001-08-04(土) 11:43
#46280-0テキストファイルの読み込み2001-08-29(水) 11:01
#23617-0同じデータばかりをOutputしてしまう VB2001-10-08(月) 17:44
#16314-0読み込みと書き込み2001-05-25(金) 20:14
#7782-0リストボックスの書き出し2000-04-27(木) 17:29
#40587-0テキストファイルの文字列置換方法2001-03-21(水) 15:34
#44902-0UTF-82001-07-11(水) 09:18
お探しの情報は見つかりましたか?お困りの問題は解決しましたか?
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
本ページは過去ログを集めて自動構成しています。よろしければこのページに関するフィードバックをお願いします。
(※ 構成の誤り、広告等の不適切な記事、リンク切れ、読めないページの報告など)