Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/43: Рейтинг темы: голосов - 43, средняя оценка - 4.77
0 / 0 / 2
Регистрация: 26.11.2012
Сообщений: 55

MAX_PATH+1

12.06.2013, 17:02. Показов 9676. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день форумчане!
Хотелось бы узнать что делает этот код...

C++
1
2
TCHAR* lpTempPath = new TCHAR[MAX_PATH+1];
GetTempPath(MAX_PATH+1, lpTempPath);
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.06.2013, 17:02
Ответы с готовыми решениями:

Массив и MAX_PATH
Добрый вечер, ув. форумчане! Имеем такой быдлокод: char char1, char2; char *mario; mario = char1; mario = char2; ...

StringToWideChar (s, pWCBuff, Max_Path) = UTF8 {True}
Доброго всем времени суток! Подскажите пожалуйста - как записать в файл текст с Юникод-кодировкой? Код: procedure...


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

Или воспользуйтесь поиском по форуму:
13
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
12.06.2013, 17:36
Получает путь к папке для хранения временных файлов.
1
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
12.06.2013, 17:48
Правильно будет записать вот так
Цитата Сообщение от kciosdse Посмотреть сообщение
TCHAR* lpTempPath = new TCHAR[MAX_PATH+1];
GetTempPath(MAX_PATH, lpTempPath);
- GetTempPath возвращает каталог соответвующий переменной окружения %TEMP% или на понятном языке путь к системной папке Temp. Обычно это
C:\WINDOS\Temp
либо
C:\Documents and Settings\User\Local Settings\Temp
1
0 / 0 / 2
Регистрация: 26.11.2012
Сообщений: 55
12.06.2013, 18:35  [ТС]
Ясненько, спасибо!
0
Brainsbreaker
 Аватар для Digit@ll
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
13.06.2013, 20:17
-=ЮрА=-, а чем так будет правильно? В MSDN об этом ясно сказано:
Цитата Сообщение от MSDN
The maximum possible return value is MAX_PATH+1 (261)
Получается, что ты сознательно уменьшаешь размер принимающего строку буфера.
1
0 / 0 / 2
Регистрация: 26.11.2012
Сообщений: 55
13.06.2013, 20:23  [ТС]
Ммм.... то-есть первоначальный вариант был правильным?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
13.06.2013, 20:33
Цитата Сообщение от kciosdse Посмотреть сообщение
то-есть первоначальный вариант был правильным?
Да, правильным. Длина файлового пути, который возвращается GetTempPath, может достигать
максимум TEMP_PATH символов (260). Плюс один символ нужен для завершающего нуля.
0
Brainsbreaker
 Аватар для Digit@ll
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
13.06.2013, 20:35
kciosdse, а ты как считаешь? Даже если ты в чем-то и не уверен, то это можно проверить.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
13.06.2013, 21:45
Digit@ll, тем что в строке следует выделять память под нуль терминатор и тем что длинна максимального файлового имени умещается именно в MAX_PATH, а MAX_PATH + 1 подрахзумевает +1 как раз на приславутій символ конца строки, если ты об этом не знал, мне тебя жаль...
http://msdn.microsoft.com/en-u... s.85).aspx
The maximum possible return value is MAX_PATH+1 (261). - MAX_PATH на имя и 1 на нуль терминатор.
Цитата Сообщение от Убежденный Посмотреть сообщение
Да, правильным. Длина файлового пути, который возвращается GetTempPath, может достигать
максимум TEMP_PATH символов (260). Плюс один символ нужен для завершающего нуля.
- а это значит в GetTmpPath следует передавать MAX_PATH

Не по теме:

Цитата Сообщение от kciosdse Посмотреть сообщение
Ммм.... то-есть первоначальный вариант был правильным?
- есть поговрка, если твое мнение не такое как у других это не значит что ты не прав.

0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
13.06.2013, 22:48
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
а это значит в GetTmpPath следует передавать MAX_PATH
Может быть. Нашел заметку в MSDN на этот счет:
Naming Files, Paths, and Namespaces
Maximum Path Length Limitation

In the Windows API (with some exceptions discussed in the following paragraphs),
the maximum length for a path is MAX_PATH, which is defined as 260 characters.
A local path is structured in the following order: drive letter, colon, backslash,
name components separated by backslashes, and a terminating null character.

For example, the maximum path on drive D is "D:\some 256-character path string<NUL>"
where "<NUL>" represents the invisible terminating null character for the current
system codepage.
Выходит, что константа MAX_PATH уже включает нуль-терминатор.

Но тогда мне непонятны две вещи.

1) При каких условиях GetTempPath может вернуть MAX_PATH+1 ?
Ведь нуль-терминатор уже учтен в MAX_PATH, а дополнительное место зачем тогда нужно ?
Для второго нуль-терминатора ?

2) Из Вашего примера не ясно, какой смысл выделять буфер размером MAX_PATH+1, а в
функцию передавать его размер, как MAX_PATH. Ведь получается, что последний символ
буфера функция так или иначе не затронет.

P.S. Кстати, в небезызвестных исходниках Win2K везде по коду с GetTempPath
встречается именно MAX_PATH, а не MAX_PATH+1.
2
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
13.06.2013, 23:00
Убежденный, тут всё просто MAX_PATH отвечает за наполнение строки, т.е любой файловый объект (абсолютно любой) умещается в указанную длину. +1 отвечает за нуль терминатор. Если объявить строку
new TCHAR[MAX_PATH]; то будет происходить потеря одного разряда (веду речь о рассматриваемом динамическом аллоке), а именно MAX_PATH, если же объявляем длинну MAX_PATH + 1 то размера блока как раз хватит умести длинну имени и 0лик который добросится, если же установить GetTempPath(MAX_PATH+1, lpTempPath); то выходит что в строке MAX_PATH+1 значимых символов + ещё 1 нуль терминатор.

Не по теме:

ЗЫ:Косвенный фактор в пользу MAX_PATH без +1 - если было бы необходимо умещать объекты с длинами имён MAX_PATH+1 то неужели бы мелокософтовцы не могли задефайнить define MAX_PATH 261.



Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от Убежденный Посмотреть сообщение
P.S. Кстати, в небезызвестных исходниках Win2K везде по коду с GetTempPath
встречается именно MAX_PATH, а не MAX_PATH+1.
- собственно мой ЗЫ.
Просьба к Digit@ll, я бы ОЧЕНЬ хотел посмотреть на файловый объект с нэймом 261 - покажешь, а?

0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
13.06.2013, 23:11
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
MAX_PATH отвечает за наполнение строки, т.е любой файловый объект (абсолютно любой) умещается в указанную длину. +1 отвечает за нуль терминатор.
Зачем +1, если MAX_PATH уже подразумевает наличие нуль-терминатора в строке ?
MAX_PATH - это, согласно MSDN, буква диска (один символ), двоеточие (еще один),
обратный слэш (еще один, итого уже три), потом оставшаяся часть пути, не больше
256 символов (итого получается 259), и завершающий нуль. Всего получается 260, в
точности соответствуя значению константы MAX_PATH.

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Если объявить строку
new TCHAR[MAX_PATH]; то будет происходить потеря одного разряда (веду речь о рассматриваемом динамическом аллоке), а именно MAX_PATH, если же объявляем длинну MAX_PATH + 1 то размера блока как раз хватит умести длинну имени и 0лик который добросится
Но ведь функция GetTempPath не будет пытаться записать в буфер больше данных,
чем ей разрешить. Указали MAX_PATH - она запишет максимум 260, включая нуль.
У Вас в примере получается так: буфер выделяется в MAX_PATH+1, а в функцию
передается MAX_PATH, на один меньше. Оставшийся символ функция не затронет
ни при каких обстоятельствах.
1
Brainsbreaker
 Аватар для Digit@ll
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
13.06.2013, 23:47
Ладно Юра, угомонись.
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Просьба к Digit@ll, я бы ОЧЕНЬ хотел посмотреть на файловый объект с нэймом 261 - покажешь, а?
Нет, не покажу. У меня GetModuleFileName возвращает максимум 258 символов, а если к названию файла добавить еще один символ, то он уже не запустится, пишет, что файл не найден. Просто я GetTempPath решил проверить по-другому, поэтому и завелся.

Не по теме:

Снова каждый остался при своем.

0
14.06.2013, 00:09

Не по теме:

Digit@ll, послушай, давай на чистоту - ты не эйс чтобы писать мне угомонись: пару постов выше написал непроверенную инфу с плевком в мою сторону, а теперь делаешь слив и пишешь угомонись. Угомонись лучше с мелкими под*ёбчиками, которыми ты пытаешся полить меня какой на форуме, не выйдет, калибр маловат дружище;)

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru