2016-11-13 95 views
1

我有一個代碼創建一個子文件夾,但首先刪除子文件夾,如果它已經存在。我在Win7 pro機器上使用了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:5> testrmdir 
    1 
    7 

以下是當子文件夾存在且爲空時的八度結果。這按預期工作。

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 

我嘗試不同的文件類型,結果如下:

  • 2 PNG文件,232 KB總 - 通過
  • 4 PNG文件,465 KB總 - 失敗
  • 3個PNG文件,共349 KB - 失敗
  • 3個csv文件,518 KB總傳遞
  • 5個csv文件,總共777 KB - 失敗

從命令行運行Octave時,行爲是相同的。我以前在MATLAB上使用過相同的代碼,沒有任何明顯的問題。現在,我不得不在另一臺機器上切換到Octave進行自動測試。

這是否有意義?有關如何使此代碼工作而不考慮子文件夾內容或大小的任何建議?

不知道這是否重要,但我在資源文件中有以下設置:confirm_recursive_rmdir(false)。

+0

我在Ubuntu上測試了一小部分文件,結果沒有問題。這些文件有多少/多大?你在哪個平臺上使用哪個版本的Octave? – stephematician

+0

@stephematician感謝您的評論。我在Win7 pro上使用了MinGW的Octave3.6.4_gcc4.6.2。我使用了總共​​大小爲349 KB的3個PNG文件。我已經爲該問題添加了更多信息。 – JackOTrade

回答

1

我將if語句改爲while循環,並解決了這個問題(即我所做的只是用「while」替換「if」)。然後我在while循環中添加了一個計數器,並在第一次迭代中看到rmdir成功。因此,我無法解釋爲什麼代碼不適用於if語句。請參閱下面的新計數器的擴展代碼。但正如我所說的,如果我只是用「while」替換原始代碼中的「if」,代碼也可以工作。

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中都可以正常工作。使用Windows 7 Professional的'jre1.8.0_91'配置爲'x86_64-w64-mingw32'。 – stephematician