2013-09-17 2 views
0

У меня есть файлA и fileB и вы хотите их обменять. (In computer programming, the act of swapping two variables refers to mutually exchanging the values of the variables)Смена двух файлов на диске

File fileA, fileB, temp 
fileA.renameTo(temp); 
try { 
    fileB.renameTo(fileA); 
    try { 
     // process fileA, B 
    } finally { 
     fileA.renameTo(fileB); 
    } 
} finally { 
    temp.renameTo(fileA); 
} 

Я хотел бы избежать временный файл, и пару переименований, если бы «железо» операция своп.

+1

«Операция замены оборудования». Аппаратные средства не обрабатываются. Аппаратное обеспечение просто видит диск как кучу секторов. – hexafraction

+2

Ну, теоретически, вы можете сделать трюк ol '' XOR', сохранив длину файла (если они разные), но я сомневаюсь в практическом использовании, не говоря уже о возможности реализации ... Кроме того, это было бы медленным, как черт, по сравнению с переименованием одного из временного имени ... – ppeterka

+0

@ ppeterka66 Преподавание искателей гипотетических и рискованных, хотя математически правильные операции могут быть не лучшей идеей ... – hexafraction

ответ

1

В общем, нет концепции «атомной» операции смены файлов. Даже если бы это было, это зависело бы от файловой системы. Я не считаю, что «общие» файловые системы (FAT *, ext *, NTFS и т. Д.) Поддерживают операцию атомного свопа.

Конечно, атомная операция недоступна через Java. Даже если бы это было так, он никогда не работал бы в файловых системах и т. Д.

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

Использование температуры с some file locking - это единственный способ получить относительно уверенную операцию свопинга.

+0

Ну, я не требую атомной операции. Я счастлив, если он композитный на заднем плане. – Val

+0

Если вы в порядке с этим bein composed в фоновом режиме, почему бы просто не сделать ваш код методом, а затем называть его? – rolfl

+0

Я тоже мог бы реализовать renameTo. Я считаю, что обмен файлами - это обычная операция. Я ошибаюсь? – Val

Смежные вопросы