Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/35: Рейтинг темы: голосов - 35, средняя оценка - 4.54
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,893

Функции rename() и remove()

17.07.2009, 14:43. Показов 7283. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть код под FreeBSD компилиться и выполняется на ура. Хочу его портировать под винду. Прога полностью на ANSI C с использованием стандартной библиотеки, по идее, проблем быть не должно. Но, иногда эти две функции возвращают ошибку (-1). Причем, проблема плавающая - воспроизвести у меня ее не получается.

Причем, когда происходит сбой, переменные, передаваемые этим функциям 100% валидные - проверено.

сам код приводить не буду, т.к. достаточно большая функция (~300 строк), но могу описать, что эта функция делает.

Code
1
2
3
4
5
6
7
1 открывается 1-й файл;
2 создается 2-й файл; (с фикс именем)
3 читаются данные из 1-го файла обрабатываются и сохраняются во 2-й файл;
4 вызов fflush для обоих файлов;
5 закрытие обоих файлов;
6 remove(_путь_к_1-му_файлу);
7 rename(_путь_к_2-му_файлу, _путь_к_1-му_файлу);
сбоит remove, а за ней, естественно и rename. причем проверено, что сам файл существует, а путь к нему указан верный.

Проверено на MSVC 6.0 - ошибка проявляется и если я в exeшник добавляю RTL, так и если я линкую через msvcrt.dll.

может для винды обязателно нужно чтобы файлы придерживались спецификации 8.3 , а то у этих файлов расширения 4-х символьные (ex: file.conf ). Но почему тогда функция иногда работает нормально. А под FreeBSD вообще проблем нет - крутиться ввиде демона и не каких проблем.

Может кто встречался с подобной проблемой?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.07.2009, 14:43
Ответы с готовыми решениями:

Реализовать функции: mktemp, remove, rename, setmode, fileleght
Здравствуйте нужна помощь с заданием по курсовой, Тема: Реализация функций стандартной библиотеки языка Си с использованием сервиса...

В чем отличие функции Rename от RenameFile?
Кроме того, что RenameFile переименовывает еще и папку

Реализовать аппликативный оператор MY-REMOVE-IF с интерфейсом и семантикой, аналогично стандартному REMOVE-IF
Реализовать аппликативный оператор MY-REMOVE-IF с интерфейсом и семантикой, аналогично стандартному REMOVE-IF.

13
Заблокирован
17.07.2009, 14:48
эти функции расчитаны на работу с 1-м файлом или одним каталогом, мож ты каталог с файликами хош переименовать тогда ничё не выйдет, вот...
1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
17.07.2009, 14:54
В тех случаях, когда функции вызывают ошибку, распечатай errno, а дальше по документации смотри, что произошло

Добавлено через 44 секунды
При этом если в процессе создания файла ты его ещё и блокнотом открывал, то по именно по этой причине файл не сможет удалиться под виндами
1
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
17.07.2009, 15:08
2polivets: ты выложи код и скажи чем под Windows компилируешь.
А так это больше похоже на гадание на кофейной гуще ...

Добавлено через 2 минуты 13 секунд
Разглядел - компилируешь MSVC 6.0
Вообще говоря староват компилятор.
Ты его патчил ? Какой у него service pack ?
1
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,893
17.07.2009, 15:08  [ТС]
Цитата Сообщение от YurA_280784 Посмотреть сообщение
эти функции расчитаны на работу с 1-м файлом или одним каталогом, мож ты каталог с файликами хош переименовать тогда ничё не выйдет, вот...
я переименовываю только файл, но сбоит сначала remove()

В тех случаях, когда функции вызывают ошибку, распечатай errno, а дальше по документации смотри, что произошло
Забыл напечатать, уже пробовал EACCES - Permission denied? Почему файл мой. вирей на компе нет.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
17.07.2009, 15:13
Точно файл на стороне не открываешь? Ну и 300 строк - не так уж и много, может выложишь код (надеюсь, это не секретная военная разработка)?

Добавлено через 1 минуту 53 секунды
И ещё. Сбоит при работе с одними и теми же путями до файлов?
1
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,893
17.07.2009, 15:23  [ТС]
Думаю, нужно на WinAPI переписывать

Вообще говоря староват компилятор.
На 2005 VS попробую вот у другана раздобыл - инсталлю

Точно файл на стороне не открываешь? Ну и 300 строк - не так уж и много, может выложишь код (надеюсь, это не секретная военная разработка)?
Точно. Код не секретный, но вызывает много функций из ядра программы (сама прога почти 10 000 строк) Поэтому мне нужно будет слать и множество функций. Но у меня код вылизан до нельзя.

Может компилер???

Отпишишусь чуть позже.

Добавлено через 3 минуты 21 секунду
Да, что и странно.
Я специальную обвязку сделал, если сбой, то данные пишем в лог. Все проверено. Вот я грешу то на RTL, то msvcrt.dll, то на MSVC 6.0. Конечно староват...
0
 Аватар для Airhand
537 / 459 / 3
Регистрация: 08.07.2009
Сообщений: 2,625
17.07.2009, 17:23
По идее, пути к файлу под Linux и под виндой отличиются. Может также оно не успело сделать предыдущее действие: попробуй вставить Sleep(200) между 5, 6 и 7 действиями.
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
17.07.2009, 17:41
На 2005 VS попробую вот у другана раздобыл - инсталлю
Не забудь поставить VS 2005 SP1.
А то еще какие ошибки найдешь

Добавлено через 10 минут 8 секунд
В Windows есть приколы. Некоторые операции реально выполняются не сразу, а с задержкой. Причем задержка зависит от непонятных вещей. Например если сильно загрузить компьютер, то файл может реально удаляться чуть ли не минуту.

Поэтому предлагаю сделай так:

rename(_путь_к_1-му_файлу, временное_имя_для_1-го_файла);
rename(_путь_к_2-му_файлу, _путь_к_1-му_файлу);
remove(временное_имя_для_1-го_файла)

Или иначе - при ошибке удаления нужно подождать немного и еще раз повторить удаление.
Причем повторов должен быть не один.
Как я уже говорил - если сильно прогрузить систему, то операции выполняются отложенно.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
17.07.2009, 19:14
> Некоторые операции реально выполняются не сразу, а с задержкой

Ахренеть... Чтобы такое сделать, одной травкой не обойдёшься...
0
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
17.07.2009, 19:42
Да не нужно никакой травки. Нужно просто сильно прогрузить процессор. Если процессор одноядерный, то вообще легко. Двухядерный труднее. Если есть установленный и работающий антивирус - легче, так как он сам грузит систему.

Безо всякого программирования очень часто на медленных компьютерах наблюдаю следующее:
Создаю каталог: program1/
Кладу туда setup.exe
Запускаю setup.exe
Устанавливаю программу.
Инсталлятор уже отработал - программа установилась.
Сразу же пытаюсь удалить setup.exe или весь каталог program1/.
Не дает удалить - чем-то залочено.
Ладно - подождал 5 сек. Все удалилось.
Бывает что 5 сек недостаточно.
0
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,893
17.07.2009, 19:44  [ТС]
Всем огромное спасибо!

Бага пропала после перекомпиляции в VC2005. По крайней мере, уже 3 часа безсбойной работы. По предыдущим наблюдениям, она должна проявиться как минимум раза два (сразу скажу, что memory leak'ов нету). Но это не очень радует, т.к. проект компилировать нужно в VC6.0 поэтому скорее всего для виндового проекта нужно будет всю файловую подсистему на WinAPI переписовать... черт, так хотелось сохранить переносимость ядра программы, но...

rename(_путь_к_1-му_файлу, временное_имя_для_1-го_файла);
rename(_путь_к_2-му_файлу, _путь_к_1-му_файлу);
remove(временное_имя_для_1-го_файла)
Не помогло, но спс

A sleep() и подобные функции:
во-первых не помогло
во-вторых неприемлемо, т.к. функция вызывается достаточно часто, что влияет на производительность и получается в зависимости от аппаратуры компа, на котором хостится прога, нужно будет подбирать интервал задержки - это тормоз и еще раз тормоз.

Придеться курить MSDN, Win32SDK и тому подобные рульные книжки

Еще раз всем огромное спасибо - тема закрыта.
0
 Аватар для Airhand
537 / 459 / 3
Регистрация: 08.07.2009
Сообщений: 2,625
17.07.2009, 19:46
Цитата Сообщение от Evg Посмотреть сообщение
Чтобы такое сделать, одной травкой не обойдёшься...
У NTFS транзакционная система записи. Что значит, что файлы пишутся не сразу, а в транзкции: когда конец транзакции пришёл, тогда считается, что файл записан. Так сохраняется целостность самой системы. А сигнал "начало транзакции" и реально началась запись на диск - это два разных события.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
18.07.2009, 00:58
Цитата Сообщение от Airhand Посмотреть сообщение
У NTFS транзакционная система записи. Что значит, что файлы пишутся не сразу, а в транзкции: когда конец транзакции пришёл, тогда считается, что файл записан. Так сохраняется целостность самой системы. А сигнал "начало транзакции" и реально началась запись на диск - это два разных события.
Я не против того, что так сделано, но как-то они не подумали о программистах. Или для удаления и переимнования файлов в винде всё-таки есть другие низкоуровневые интерфейсы, а rename и remove - для совместимости? Хотя любом случае если для совместимости, то ожидание завершения операции надо затаскивать вовнутрь, а не возлагать на программиста
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.07.2009, 00:58
Помогаю со студенческими работами здесь

Функция remove() удаляет только заранее запланированые файлы, выдавая ошибку на remove (STRING)
Салем, начал изучать файловую работу в С++, и столкнулся с такой проблемой, что функция remove() соглашается удалять только заранее...

List.remove() vs asList.remove()
Всем привет. Хотел решить одну задачку тут на форуме, но что-то у меня все из рук валится, и в переносном смысле тоже. Немного...

Как помощью функции Remove удалить все 0
Подскажите как помощью функции Remove удалить все 0.

rename
Здравствуйте, сделал создание новости + загрузку картинки, мне нужно что бы при загрузке имя картинки изменилось на ид новости. Помоги...

Copyfile and rename
Утро доброе. есть код: CopyFile(PChar(OpenPictureDialog1.FileName), PChar( ExtractFilePath(Application.ExeName)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru