2016-11-13 8 views
1

У меня есть код, который создает подпапку, но сначала удаляет подпапку, если она уже существует. Я использую Octave3.6.4_gcc4.6.2 для MinGW на машине Win7 pro. Я заметил, что mkdir терпит неудачу, если вложенная папка существует и содержит несколько файлов. Кажется, что rmdir не закончил в фоновом режиме до того, как будут выполнены следующие строки кода. Ниже приведен образец тестового кода.octave 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 

Ниже приведен результат для октавных, когда вложенная папка существует и содержит 3 PNG файлов с общим размером 349 КБ. Статус равен 1 для mkdir и rmdir. Тем не менее, функция exist сообщает, что папка не существует. Я проверяю из Windows Explorer, что вложенная папка удалена. Я предполагаю, что когда 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 спасибо за комментарий. Я использую Octave3.6.4_gcc4.6.2 для MinGW для Win7 pro. Я использовал 3 PNG-файла с общим размером 349 КБ. Я добавил дополнительную информацию к вопросу. – 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