переместить файл (не могу сообразить как это сделать...)

Модератор: Модераторы разделов

Аватара пользователя
some one else
Сообщения: 24

переместить файл

Сообщение some one else »

Добрый день, многоуважаемые Гуру!!

Ситуация такая -- начал недавно программировать в linux под с++, вот и что-то вопросы какие-то появляются.

1. Подскажите пожалуйста, функцию, чтобы можно было переместить файл.
Или это только можно сделать связкой -- скопировать фаайл, а затем удалить оригинал??
Просто судя по времени перемещения файла, как это делают, например, файловые менеджеры, они не копируют файл, а просто вносят изменения в файловую таблицу, но это конечно же при условии, что src и dst находятся в одном разделе.
2. Подскажите пожалуйста, можно ли выполнять команды shell, сделав запрос из тела программы?? и где почитать об этом.
3. Подскажите ещё один маленький вопрос -- а где же можно взять man.pages или информацию в другом виде по syscall??

Извините, что так много вопросов :unsure:
Заранее признателен. ^_^
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: переместить файл

Сообщение d_Sun »

some one else писал(а):
25.10.2005 11:44
Или это только можно сделать связкой -- скопировать фаайл, а затем удалить оригинал??


Да.
Моя подпись сильно длинная :)
Спасибо сказали:
Аватара пользователя
Asgard
Сообщения: 215
Статус: North Valfader

Re: переместить файл

Сообщение Asgard »

Подскажите ещё один маленький вопрос -- а где же можно взять man.pages или информацию в другом виде по syscall??

man 2 func
sator arepo tenet opera rotas ;)
------------------------------------------------------------
LJ
Спасибо сказали:
Аватара пользователя
polachok
Бывший модератор
Сообщения: 2199
Статус: главный форумный маргинал
ОС: gnu/linux

Re: переместить файл

Сообщение polachok »

1.а ты глянь исходник mv - узнаешь как это сделать оптимально.
2.команды шелл? встроенные? думаю нет (вероятно через ж**** все можно)
3.opennet например
И немедленно выпил.
Спасибо сказали:
Аватара пользователя
nercus
Сообщения: 150

Re: переместить файл

Сообщение nercus »

2d_Sun:
QUOTE(some one else @ Oct 25 2005, в 11:44) *


Или это только можно сделать связкой -- скопировать фаайл, а затем удалить оригинал??



Да.

mv a b == cp a b && rm a ? :D я тоже хочу такую траву)

2some one else:
1. man 2 rename - "rename - change the name or location of a file"
в случае перемещения/переименования файла изменяется только блок описания директории, в который находился/будет находиться файл. а блоки самого файла никоим образом не затрагиваются.

2. man 3 system - "system - execute a shell command"

3. Asgard уже ответил
2.6.14-gentoo-r5
kde-3.5.0 | openbox-3.2
Deep Purple | Rob Zombie | Led Zeppelin | ДДТ
Спасибо сказали:
Аватара пользователя
Asgard
Сообщения: 215
Статус: North Valfader

Re: переместить файл

Сообщение Asgard »

на самом деле
rename == link(old, new) && unlink(old).
+ он умеет перемещать каталоги, что обычная связка link + unlink делать не умеет
sator arepo tenet opera rotas ;)
------------------------------------------------------------
LJ
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: переместить файл

Сообщение d_Sun »

nercus писал(а):
26.10.2005 12:00
mv a b == cp a b && rm a ? :D я тоже хочу такую траву)


:D Исходники посмотри, а потом будеш блистать остроумием! :D т.к. на системном уровне все происходит так как я и говорил выше.
Моя подпись сильно длинная :)
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: переместить файл

Сообщение elide »

в том то и дело, что смотрели исходники (:
и там это делается нихрена не копированием и удалением...
слава роботам!
Спасибо сказали:
Аватара пользователя
Asgard
Сообщения: 215
Статус: North Valfader

Re: переместить файл

Сообщение Asgard »

из исходников mv:

Код: Выделить всё

    199         if (!rename(from, to)) {
    200                 if (vflg)
    201                         printf("%s -> %s\n", from, to);
    202                 return (0);
    203         }

так что cp && rm отменяется
sator arepo tenet opera rotas ;)
------------------------------------------------------------
LJ
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: переместить файл

Сообщение elide »

d_Sun, слив защитан.
слава роботам!
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: переместить файл

Сообщение d_Sun »

elide писал(а):
27.10.2005 00:27
d_Sun, слив защитан.


http://www.freebsd.org/cgi/cvsweb.cgi/src/...x-cvsweb-markup

Читать до наступления просветления :)

З.Ы. Особенно обратите внимание на функцию fastcopy. :)
Моя подпись сильно длинная :)
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: переместить файл

Сообщение flook »

d_Sun писал(а):
25.10.2005 12:16
some one else писал(а):
25.10.2005 11:44


Или это только можно сделать связкой -- скопировать фаайл, а затем удалить оригинал??


Да.

Нет. Есть еще вызов rename, но он работает в пределах одной партиции.
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: переместить файл

Сообщение d_Sun »

flook писал(а):
27.10.2005 12:20
d_Sun писал(а):
25.10.2005 12:16

some one else писал(а):
25.10.2005 11:44


Или это только можно сделать связкой -- скопировать фаайл, а затем удалить оригинал??


Да.

Нет. Есть еще вызов rename, но он работает в пределах одной партиции.


Ссылочку на исходники rename можно?
Моя подпись сильно длинная :)
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: переместить файл

Сообщение elide »

d_Sun, интересно, если у меня на флэшке размером в 128 метров лежит стометровый файл, то я не смогу его переместить в другую папку на флэшке? если mv == cp && rm, то для cp на флэшке не хватит места....
а как же я тогда спокойно перемещаю файлы в таких условиях?
ответ просто: mv != cp && mv
получается, что вот как раз на системном уровне все происходит совсем не так, как ты тут пытаешься доказать...
слава роботам!
Спасибо сказали:
Аватара пользователя
nercus
Сообщения: 150

Re: переместить файл

Сообщение nercus »

приду домой - напишу, как все происходит на системном уровне. мож кому пригодится
2.6.14-gentoo-r5
kde-3.5.0 | openbox-3.2
Deep Purple | Rob Zombie | Led Zeppelin | ДДТ
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: переместить файл

Сообщение d_Sun »

elide писал(а):
27.10.2005 18:12
d_Sun, интересно, если у меня на флэшке размером в 128 метров лежит стометровый файл, то я не смогу его переместить в другую папку на флэшке? если mv == cp && rm, то для cp на флэшке не хватит места....
а как же я тогда спокойно перемещаю файлы в таких условиях?
ответ просто: mv != cp && mv
получается, что вот как раз на системном уровне все происходит совсем не так, как ты тут пытаешься доказать...


Хм... Действительно... Признаю свою ошибку :( Но как ты прокомментируеш исходник который я кидал выше?
Моя подпись сильно длинная :)
Спасибо сказали:
Аватара пользователя
Asgard
Сообщения: 215
Статус: North Valfader

Re: переместить файл

Сообщение Asgard »

Возвращаясь к исходникам mv:
* If rename fails because we're trying to cross devices, and
* it's a regular file, do the copy internally; otherwise, use
* cp and rm

т.о. cp && rm применяются как альтернатива rename, если он косячит.
sator arepo tenet opera rotas ;)
------------------------------------------------------------
LJ
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: переместить файл

Сообщение t.t »

т.о. cp && rm применяются как альтернатива rename, если он косячит.
Только не косячит, а вполне нормально себе отказывается работать в нештатной ситуации :)
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
nercus
Сообщения: 150

Re: переместить файл

Сообщение nercus »

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

Рассмотрим некую абстрактную файловую систему. Любая файловая система в UNIX
оперирует объектами двух типов - это логический блок и inode.

Логический блок является атомарным объектом данных. Обычно имеет размер 1Kb, 2Kb
или 4 Kb. В любом случае, размер логического блока всегда должен быть кратен
размеру блока блочного устройства (обычно 512b).

inode - это любой объект файловой системы (файл, директория, симлинк, файл
блочного и символьного устройств, пайп, unix-сокет). В inode хранится (в общем случае,
не зависимо от типа фс):

- информация о владельце (uid и gid)
- timestams (access time, modification time и change time)
- права доступа
- тип inod'ы (файл, директория, симлинк и т.п.)
- размер
- список номеров логических блоков, используемых данной inode'ой
- счетчик использования (use или reference counter, кому как больше нравится)
* Заметьте, что имя обьекта в inode _не_ содержится.

Теперь рассмотрим три типа inode. Файл, симлинк и директорию.

С файлом все просто - содержимое файла хранится в логических блоках,
перечисленных в inode.

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

Директория. Логические блоки директории содержат в себе номера inode и имена
файлов (симлинков, директорий и т.п.), которые содержатся в директории.

Единственный нюанс (касается всех типов inode) - inode'а содержит в себе только
номера N первых блоков файла (inode'а содержит N+M полей зарезервированных для
номеров блоков). Если файл не помещается в N блоков - используется косвенная
адресация. N+1'ый номер блока в inode указывает на блок, содержащий номера
блоков файла с N+1 по N+K (где K = размер блока / sizeof(int)). Это блок
косвенной адресации первого рода. N+2 блок в inode указывает на блок косвенной
адресации второго рода (содержит номера блоков косвенной адресации первого
рода). И так далее до N+M.


Теперь собственно о том, что же происходит, когда мы делаем ln, unlink, rmdir,
cp и mv (rm не рассматриваем, поскольку аналогично unlink || rmdir).

ln source dstpath/dstname(без -s):
В логические блоки директории dstpath добавляется новая запись с именем dstname
и номером inode таким же, как и у исходного файла. Reference counter inode'ы
этого файла увеличивается на 1.

unlink source:
Reference counter inode'ы уменьшается на 1 и запись о файле удаляется из
логических блоков директории. Если счетчик достигает значения 0, блоки
занимаемые файлом и inode помечаются как свободные (используется битовая карта
логических блоков и битовая карта inode). Если случиться так, что inode'a не
упоминается ни в одной из директорий, но имеет ref.cnt. > 0, такая inode'a считается
сиротой (orphan), о чем с радостью сообщит fsck.

rmdir source:
В случае, если директория пуста, запись о ней удаляется из родительской
директории и inode'а директории освобождается, так же как и в случае unlink. Так
же reference counter _родительской_ директории уменьшается на 1 (ref.cnt. для
директорий содержит количество дочерних директорий, включая . и ..).

cp source dstpath/dstname (в случае копирования файла):
Выделяется новая inode и новые логические блоки на фс содержащей dstpath. В
директорию dstpath добавляется новая запись с именем dstname и номером новой
inode'ы. Затем содержимое блоков исходного файла копируется в блоки нового
файла.

mv source dstpath/dstname (в случае файла):
Если source и dstpath/dstname находятся на одной файловой системе, то действия
аналогичны ln && unlink. (rename == link + unlink)
Если source и dstpath/dstname находятся на разный файловых системах, то действия
аналогичны cp && unlink.

PS. Мож пригодиться кому.
2.6.14-gentoo-r5
kde-3.5.0 | openbox-3.2
Deep Purple | Rob Zombie | Led Zeppelin | ДДТ
Спасибо сказали:
Аватара пользователя
nercus
Сообщения: 150

Re: переместить файл

Сообщение nercus »

Кстати... Уважаемый d_Sun, вы чуть не сбили человека с верного предположения ;)
some one else писал(а):
25.10.2005 11:44
не копируют файл, а просто вносят изменения в файловую таблицу, но это конечно же при условии, что src и dst находятся в одном разделе
2.6.14-gentoo-r5
kde-3.5.0 | openbox-3.2
Deep Purple | Rob Zombie | Led Zeppelin | ДДТ
Спасибо сказали:
Аватара пользователя
d_Sun
Сообщения: 291

Re: переместить файл

Сообщение d_Sun »

nercus писал(а):
28.10.2005 01:16
Кстати... Уважаемый d_Sun, вы чуть не сбили человека с верного предположения ;)


Приношу свои извинения, всем кого чуть не сбил с верного предположения! ;)

nercus вы этого хотели? :)
Моя подпись сильно длинная :)
Спасибо сказали: