azrael писал(а):Ну, аналог не "существует", а написан вами, а значит потенциально может содержать ошибки, чего и следует (по моему личному мнению, конечно), по возможности, избегать, используя уже написанные функции в тысячу раз отлаженных библиотеках.
Совсем уж непонятно, что вы имели ввиду под "вызвана всего одна функция". Сколько вам нужно вызвать функций, чтобы считать подключение библиотеки оправданным?
Ко всему надо подходить с умом. В виндовых проектах windows.h всегда подключен и все необходимые библиотеки для WinAPi функций уже есть. Если вы думаете что GetFileAttributes - настолько сложная функция что боитесь ею пользоваться - вперед подключайте другие библиотеки. Только давайте чуть задумаемся что они делают и что это может за собой повлечь.
ATL:: FileExists
Код: Выделить всё
inline BOOL FileExists( __in const char* pszPath )
{
return ::PathFileExistsA( pszPath );
}
Вроде все элементарно просто. Но PathFileExists - не входит в стандартное API это расширение шела. Оно требует подключения к проекту shlwapi.lib и загружает дополнительную dll shlwapi.dll, которые ещё и могут отличаться на разных версиях винды. Конечно чего нам мелочиться, но ради одной "утилитарной функции" ((С) Romeo) я бы лично этого делать не стал.
access
Поискав её в MSDN можно найти такую строчку -
"This POSIX function is deprecated beginning in Visual C++ 2005. Use the ISO C++ conformant _access or security-enhanced _access_s instead."
Что уже не приятно.
Дальше покопавшись немного можно найти её реализацию -
Код: Выделить всё
errno_t __cdecl _taccess_s (
const _TSCHAR *path,
int amode
)
{
DWORD attr;
_VALIDATE_CLEAR_OSSERR_RETURN_ERRCODE( (path != NULL), EINVAL);
_VALIDATE_CLEAR_OSSERR_RETURN_ERRCODE( ((amode & (~6)) == 0), EINVAL);
attr = GetFileAttributes((LPTSTR)path);
if (attr == 0xffffffff) {
/* error occured -- map error code and return */
_dosmaperr(GetLastError());
return errno;
}
if(attr & FILE_ATTRIBUTE_DIRECTORY)
{
/* All directories have read & write access */
return 0;
}
/* no error; see if returned premission settings OK */
if ( (attr & FILE_ATTRIBUTE_READONLY) && (amode & 2) ) {
/* no write permission on file, return error */
_doserrno = E_access;
errno = EACCES;
return errno;
}
else
/* file exists and has requested permission setting */
return 0;
}
Никакой фантастики тут нет, тот же GetFileAttributes. access мне лично гораздо больше нравится чем atl-ная реализация. Он хоть не требует ничего дополнительного. Но ничего гениального и тут нет. И особого смысла её использовать нет. Разве что для переносимости. Но, как показывает практика, переносимость понятие тоже растяжимое, и проще от этого сильно не будет. А вот то что её могут сделать depricated это пожалуйста.
Библиотеки это конечно полезное дело, но подключать их только из за того что там есть функция на 5 строчек, которую ну очень страшно написать по тому как она будет "написана нами" по мне дак странно. Может в таком случае лучше ничего не писать, там ведь могуть быть потенциальные баги