Реализация переименования в файловой системе fuse

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

Когда я попытался сделать это на bash, mv file1 file2, он внутренне вызывает функцию переименования (я использовал параметр -d, чтобы проверить это).

Когда я пытаюсь переименовать функцию в графическом интерфейсе, она снова вызывает функцию переименования.

Но если файл2 является уже существующим файлом, команда mv перезаписывает его, тогда как графический интерфейс не позволяет мне переименовать файл. Как применить это ограничение, поскольку внутри оба этих действия вызывают функцию rename без каких-либо различий.


person Torpedo    schedule 28.11.2013    source источник
comment
Почему вы считаете, что поведение с mv для вашей файловой системы отличается от поведения любой другой файловой системы?   -  person Ignacio Vazquez-Abrams    schedule 28.11.2013
comment
На мой взгляд, единственный способ получить такое поведение — проверить, существует ли файл как отдельная операция, прежде чем даже вызывать rename. Я предполагаю, что графический интерфейс, который вы описываете, делает это.   -  person Joachim Isaksson    schedule 28.11.2013
comment
Я не верю, что mv отличается. Меня беспокоит то, что когда я делаю mv file1 file2, file2 перезаписывается, если он уже существует. Если я делаю переименование на гуи, мне мешает. Как мне справиться с этим в моем коде, когда внутри они оба вызывают функцию переименования.   -  person Torpedo    schedule 28.11.2013
comment
Какое ограничение вы имеете в виду, когда говорите, как применить это ограничение?   -  person    schedule 28.11.2013
comment
Например, если переименование было вызвано командой mv, я должен иметь возможность перезаписать существующий файл. Если это просто переименование, сделанное в графическом интерфейсе, я должен запретить это. Афаик, в функции переименования нет возможности узнать, кто звонит.   -  person Torpedo    schedule 28.11.2013
comment
GUI ведет себя так, как ему заблагорассудится, и код файловой системы не имеет к этому никакого отношения. Он реализует API файловой системы, как задокументировано, и все.   -  person n. 1.8e9-where's-my-share m.    schedule 28.11.2013
comment
Я думаю, это имеет смысл. Когда я попытался переименовать с помощью графического интерфейса, он не вызывал внутреннюю функцию переименования. Я проверил это с помощью опции -d в FUSE. Только команда mv вызывает внутреннее переименование. Так что моя проблема вроде как решена. Спасибо всем. :)   -  person Torpedo    schedule 28.11.2013


Ответы (1)


Функция rename атомарно заменяет целевой файл удалением старого имени. В этом весь смысл, и если он не сделает это правильно, разные вещи могут сильно сломаться. Для приложений, которые хотят предотвратить переименование поверх другого файла, они должны сначала использовать функцию link (которая потерпит неудачу, если цель существует), а затем unlink старое имя, если link удалось.

person R.. GitHub STOP HELPING ICE    schedule 28.11.2013
comment
Или, что еще проще, графический интерфейс может просто проверять, используется ли другое имя файла, и отображать ошибку, если это так. Конечно, это не атомарно, но вряд ли это будет иметь значение в файловом менеджере с графическим интерфейсом. - person ; 28.11.2013
comment
@duskwuff: Действительно, я подозреваю, что так работает большинство сломанных программ с графическим интерфейсом ... но это не значит, что мы должны мириться с этим. На самом деле это может иметь значение, если в одном окне выполняется большая операция копирования/перемещения, при которой диск плохо перегружается/заменяется, и интерактивно переименовываете файл в другом окне. - person R.. GitHub STOP HELPING ICE; 28.11.2013
comment
Однако вы не всегда можете использовать link(). Не все файловые системы поддерживают жесткие ссылки (например, FAT не поддерживает), а некоторым (например, HFS+) может потребоваться много дополнительной работы для обработки связи/развязки. - person ; 28.11.2013
comment
Я думаю, что это похоже на то, что упомянул сумраквафф. Графический интерфейс просто проверяет, используется ли имя файла, и отображает сообщение об ошибке. - person Torpedo; 28.11.2013
comment
@duskwuff: Интересный момент. Есть ли обходной путь для этого? - person R.. GitHub STOP HELPING ICE; 29.11.2013