2016-11-13 79 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