2016-11-13 4 views
1

サブフォルダを作成するコードがありますが、サブフォルダが既に存在する場合は最初にサブフォルダが削除されます。 Win7プロマシンでMinGWにOctave3.6.4_gcc4.6.2を使用しています。サブフォルダが存在し、いくつかのファイルが含まれていた場合、mkdirが失敗することに気付きました。次のコード行が実行される前に、rmdirがバックグラウンドで完了していないようです。以下は、テストコードのサンプルです。オクターブmkdirが再帰的なrmdirの後に失敗する

parentDir = 'C:\Temp\rmDir'; 
childDir = fullfile(parentDir, 'output'); 
if (exist(childDir, 'dir') ~= 0) 
    [status] = rmdir(childDir, 's'); 
    disp(status); 
end; 
[status] = mkdir(parentDir, 'output'); 
disp(status); 
disp(exist(childDir, 'dir')); 

以下は、サブフォルダが存在しない場合のOctaveの結果です。これは期待どおりに動作します。

octave:5> testrmdir 
    1 
    7 

以下は、サブフォルダが存在し、空の場合のOctaveの結果です。これは期待どおりに動作します。

octave:6> testrmdir 
    1 
    1 
    7 

以下は、サブフォルダが存在し、合計サイズが349 KBの3つのPNGファイルを含む場合のOctaveの結果です。 mkdirとrmdirの両方のステータスは1です。ただし、存在する関数は、フォルダが存在しないことを報告します。 Windowsエクスプローラからサブフォルダが削除されたことを確認します。私の推測では、mkdirが実行されると、ファイルは以前のrmdir関数によって削除されているということです。 mkdirはrmdirによってサブフォルダがまだ削除されていないため、成功を報告します。ただし、存在する時間が経過するとrmdirが完了し、サブフォルダは存在しなくなります。

octave:7> testrmdir 
    1 
    1 
    0 

Iは、以下の結果と異なるファイルタイプ試み:

  • 2つのPNGファイル、232キロバイトの合計が -
  • 3 PNGファイルをフェイル -
  • 4つのPNGファイル、465キロバイトの合計が通過、349 KB合計 - 失敗
  • 3 csvファイル、合計518 KB - 合格
  • 5 csvファイル、合計777 KB - 失敗

動作は、コマンドラインからOctaveを実行した場合と同じです。私は過去にMATLABで同じコードを使用しましたが、目立つ問題はありませんでした。今のところ、別のマシンでテスト自動化のためにOctaveに切り替える必要がありました。

これは意味がありますか?サブフォルダの内容やサイズに関係なく、このコードを動作させる方法に関する提案はありますか?

これが重要であるかどうかはわかりませんが、リソースファイルには次の設定があります:confirm_recursive_rmdir(false)。

+0

私はこれをUbuntuの少数のファイルでテストしましたが、問題はありませんでした。ファイル数はいくつですか?どのバージョンのOctaveを使用していますか? – stephematician

+0

@stephematicianコメントのおかげで。私はWin7プロのMinGWにOctave3.6.4_gcc4.6.2を使用しています。合計サイズが349 KBの3つのPNGファイルを使用しました。私は質問に多くの情報を追加しました。 – JackOTrade

答えて

1

if文をwhileループに変更しました。これで問題は解決されました(つまり、「if」を「while」に置き換えただけです)。その後、whileループにカウンタを追加し、rmdirが最初の繰り返しで成功したことを確認しました。したがって、なぜコードがif文で動作しないのか説明できません。下の新しいカウンターで拡大コードを参照してください。しかし私が言ったように、コードは、元のコードの "if"を単に "while"に置き換えるだけで動作します。

parentDir = 'C:\Temp\rmDir'; 
childDir = fullfile(parentDir, 'output'); 
count = 0; 
while (exist(childDir, 'dir') ~= 0) 
%if (exist(childDir, 'dir') ~= 0) 
    count++ 
    [status] = rmdir(childDir, 's'); 
    disp(status); 
    disp(count); 
end; 
[status] = mkdir(parentDir, 'output'); 
disp(status); 
disp(exist(childDir, 'dir')); 
+1

両方ともOctave 4.0.3で正常に動作します。 'x86_64-w64-mingw32'と' jre1.8.0_91'、Windows 7 Professionalで構成されています。 – stephematician

関連する問題