2014-10-01 2 views
0

Я использую rake для копирования файлов, которые я получаю из одной папки в две подпапки.Ruby не может удалить файл после cp на окнах

После копирования я пытаюсь удалить эти файлы из их исходной папки.

Я не могу удалить некоторые файлы (обычно только 1 или 2 из 5 или около того).

При использовании mv (и не CLEAN) Я принимаю сообщение об ошибке доступа.

Я считаю, что Windows (моя ОС) по-прежнему содержит ссылку на файл/с и поэтому не будет разрешить мне их удалить.

Я могу удалить файлы из кода без проблем. Не должно быть проблем с разрешениями.

Если моя теория верна, что все еще есть ссылка, открытая для файла, то как я могу закрыть эти ссылки?

Это может быть что-то еще?

Код:

DOCK  = '/path' 
NEW_FILES = DOCK + '/NewFiles' 

dock_stock = FileList.new(DOCK + '/*.xml') 

file target_path do |t| 
    unless dock_stock.empty? 
    mkdir t.name 
    dock_stock.each do |f| 
     target_new_files_folder = f.pathmap(NEW_FILES + '/%f') 

     mv f, target_new_files_folder 
    end 
    end 
end 

Также следует отметить эту задачу зависимость к многозадачности (на самом деле зависимости от зависимости от иждивенцев). task :clean => target_path является одним из них.

Так что, может быть, проблема связана с несколькими потоками или заданием :clean.

+0

нужен ли весь этот код, чтобы воспроизвести проблему или вы можете обеспечить более короткий пример? – Stefan

+0

Я мог бы стереть работу вокруг, я думал, что это будет полезно для других. Я вижу вашу точку зрения. –

ответ

0

Кажется, что был агент McAfee, который ссылался на файлы, не позволяющие мне их удалять.

По большей части, если бы я попытался удалить их позже, со временем они удалили бы.

Когда я пишу по большей части, я имею в виду, что однажды в голубой луне он может хранить файлы в течение нескольких дней, пока не будет выпущен вручную.

Обходным решением было бы записать проблемные файлы и исключить их из списка файлов и попытаться стереть их позже.

Желание иметь лучшее решение.

0

Окна delcommand имеет f вариант, который заставляет исключить. Совместимый с/д (СКИТ) и запустить его из Руби, например exec:

exec 'del /f /q filename' 
Смежные вопросы