Я использую функцию _open() для того чтобы открыть файл размером более 2 Гб...
int fh = _open(Path, _O_RDONLY);
Дело в том, что раньше я использовал fopen() и, вообще, работал не с handle (file descriptor), а с FILE объектами. С fopen() не было проблем с открытием больших файлов, а _open() не хочет. Выдает ошибку E2BIG — Argument list too long.
Как обойти это? Мне именно с file descriptor нужно открыть файл, т.к. хочу использовать функции _lseeki64() и _telli64(). В них курсор можно задать типом int64, а в fseek() и в ftell() используется long, а его не хватает чтобы пробежаться по большому файлу. Вот, ведь замкнутый круг. Функции для работы с большими файлами, а использовать их никак не получается...
Такой еще вопрос. Я не пробывал _sopen_s() потому что компилирую на VS7, а _sopen_s() только в VS2005 появляется. В принципе могу использовать и VS2005, поможет ли только _sopen_s() в моем случае?
Спасибо!
Re: _open() выдает ошибку E2BIG - Argument list too long
> Как обойти это? Мне именно с file descriptor нужно открыть файл, т.к. хочу > использовать функции _lseeki64() и _telli64(). В них курсор можно задать > типом int64, а в fseek() и в ftell() используется long, а его не хватает > чтобы пробежаться по большому файлу. Вот, ведь замкнутый круг. Функции для > работы с большими файлами, а использовать их никак не получается...
Странно.
Но вот что сказано про open
Large File Summit extensions are added.
Есть функция fileno, но в данном случае она не нужна.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: _open() выдает ошибку E2BIG - Argument list too long
Здравствуйте, Alexander Pazdnikov, Вы писали:
AP>Странно. AP>Но вот что сказано про open
AP>Large File Summit extensions are added.
AP>Есть функция fileno, но в данном случае она не нужна.
А, вообще, ошибка E2BIG — Argument list too long с чем может быть связана? Если дословно, то что-то с аргументами в функции не так, но что там может быть не так!?
Re[3]: _open() выдает ошибку E2BIG - Argument list too long
Mechanic55 wrote:
> Здравствуйте, Alexander Pazdnikov, Вы писали: > > AP>Странно. > AP>Но вот что сказано про open > > AP>Large File Summit extensions are added. > > AP>Есть функция fileno, но в данном случае она не нужна. > > А, вообще, ошибка E2BIG — Argument list too long с чем может быть связана? > Если дословно, то что-то с аргументами в функции не так, но что там может > быть не так!?
Не очень хорошо понял, зачем пользоваться функцией, которая начинается
с '_'? Максимум — это уровень драйверов и ядра, прикладной программе такими
функциями пользоваться не зачем.
Есть стандартная функция open без '_'.
Вот что написано в GLIBC(2.3.6) по поводу open
If on a 32 bit machine the sources are translated with _FILE_OFFSET_BITS ==
64 the function open returns a file descriptor opened in the large file
mode which enables the file handling functions to use files up to 2^63
bytes in size and offset from -2^63 to 2^63. This happens transparently for
the user since all of the lowlevel file handling functions are equally
replaced.
E2BIG — возможно связана с ограничением длины пути.
есть макрос PATH_MAX в GLIBC он в limits.h
Posted via RSDN NNTP Server 2.1 beta
Re[4]: _open() выдает ошибку E2BIG - Argument list too long
Здравствуйте, Alexander Pazdnikov, Вы писали:
AP>Не очень хорошо понял, зачем пользоваться функцией, которая начинается AP>с '_'? Максимум — это уровень драйверов и ядра, прикладной программе такими AP>функциями пользоваться не зачем. AP>Есть стандартная функция open без '_'.
AP>Вот что написано в GLIBC(2.3.6) по поводу open AP>If on a 32 bit machine the sources are translated with _FILE_OFFSET_BITS == AP>64 the function open returns a file descriptor opened in the large file AP>mode which enables the file handling functions to use files up to 2^63 AP>bytes in size and offset from -2^63 to 2^63. This happens transparently for AP>the user since all of the lowlevel file handling functions are equally AP>replaced.
AP>E2BIG — возможно связана с ограничением длины пути. AP>есть макрос PATH_MAX в GLIBC он в limits.h
На самом деле в своих поисках я отталкивался от _lseeki64() и _telli64() функций. Мне они нужны для того чтобы использовать int64 указатели внутри файлов. Кроме того эти функции используют file descriptor вместо привычного мне FILE. Раньше использовал функции fseek() и ftell(), но в них long указатель которого мне для того чтобы объять необъятные мои файлы не хватает уже... Собственно в msdn посмотрел примеры с _lseek() и _tell() и взял _open() из них... Сейчас попробую open() просто... Может все нормально будет действительно
Кстати, такой вопрос глупый... В структуре FILE _file — это случайно не file descriptor? Его нельзя задействовать в _lseeki64() и _telli64()?
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;
Re[5]: _open() выдает ошибку E2BIG - Argument list too long
> В структуре FILE _file — это случайно не > file descriptor? Его нельзя задействовать в _lseeki64() и _telli64()?
Можно — это file descriptor, только нужно его получить через функцию
fileno(FILE *); для корректности.
Posted via RSDN NNTP Server 2.1 beta
Re[4]: _open() выдает ошибку E2BIG - Argument list too long
Здравствуйте, Alexander Pazdnikov, Вы писали:
AP>Не очень хорошо понял, зачем пользоваться функцией, которая начинается AP>с '_'? Максимум — это уровень драйверов и ядра, прикладной программе такими AP>функциями пользоваться не зачем. AP>Есть стандартная функция open без '_'.
AP>Вот что написано в GLIBC(2.3.6) по поводу open AP>If on a 32 bit machine the sources are translated with _FILE_OFFSET_BITS == AP>64 the function open returns a file descriptor opened in the large file AP>mode which enables the file handling functions to use files up to 2^63 AP>bytes in size and offset from -2^63 to 2^63. This happens transparently for AP>the user since all of the lowlevel file handling functions are equally AP>replaced.
AP>E2BIG — возможно связана с ограничением длины пути. AP>есть макрос PATH_MAX в GLIBC он в limits.h
В msdn вот что написано про open():
This POSIX function is deprecated beginning in Visual C++ 2005. Use the ISO C++ conformant _open instead.
Re[5]: _open() выдает ошибку E2BIG - Argument list too long
Mechanic55 wrote:
> На самом деле в своих поисках я отталкивался от _lseeki64() и _telli64() > функций. Мне они нужны для того чтобы использовать int64 указатели внутри > файлов.
Пользутесь типом off_t, прямое использование int64_t — некорректно.
Posted via RSDN NNTP Server 2.1 beta
Re[6]: _open() выдает ошибку E2BIG - Argument list too long
Здравствуйте, Alexander Pazdnikov, Вы писали:
>> В структуре FILE _file — это случайно не >> file descriptor? Его нельзя задействовать в _lseeki64() и _telli64()? AP>Можно — это file descriptor, только нужно его получить через функцию AP>fileno(FILE *); для корректности.
Суперрррр!!!! Ща мы ее
Re[5]: _open() выдает ошибку E2BIG - Argument list too long
Mechanic55 wrote:
> В msdn вот что написано про open(): > This POSIX function is deprecated beginning in Visual C++ 2005. Use the > ISO C++ conformant _open instead.
О....ть!!!
А в MS случаем функцией FileOpen или OpenFile может надо пользоваться, по
крайней мере когда с com-портами там работал, то пользовал именно эту
функцию, но не open(POSIX).
MS, скорее всего, POSIX совсем решили задвинуть потихоньку.
Posted via RSDN NNTP Server 2.1 beta
Re[6]: _open() выдает ошибку E2BIG - Argument list too long
Здравствуйте, Alexander Pazdnikov, Вы писали:
>> В структуре FILE _file — это случайно не >> file descriptor? Его нельзя задействовать в _lseeki64() и _telli64()? AP>Можно — это file descriptor, только нужно его получить через функцию AP>fileno(FILE *); для корректности.
У меня еще такого плана вопрос... Если я заменяю в коде fseek(File,(long) Offset,Mode) на _lseeki64(_fileno(File), Offset, Mode), то если первая функция сдвигает file pointer в File, то вторая ничего не делает... Я пытаюсь искусственно это сделать с помощью fsetpos(File, &pos)... Пока не очень получается, правда... fsetpos() для таких целей нудно использовать? как, вообще, правильно ее применить?
Re[7]: _open() выдает ошибку E2BIG - Argument list too long
Здравствуйте, Mechanic55, Вы писали:
M>Здравствуйте, Alexander Pazdnikov, Вы писали:
>>> В структуре FILE _file — это случайно не >>> file descriptor? Его нельзя задействовать в _lseeki64() и _telli64()? AP>>Можно — это file descriptor, только нужно его получить через функцию AP>>fileno(FILE *); для корректности.
M>У меня еще такого плана вопрос... Если я заменяю в коде fseek(File,(long) Offset,Mode) на _lseeki64(_fileno(File), Offset, Mode), то если первая функция сдвигает file pointer в File, то вторая ничего не делает... Я пытаюсь искусственно это сделать с помощью fsetpos(File, &pos)... Пока не очень получается, правда... fsetpos() для таких целей нудно использовать? как, вообще, правильно ее применить?
В смысле не нудно, а нужно
Re[8]: _open() выдает ошибку E2BIG - Argument list too long
Mechanic55 wrote: > fseek(File,(long) Offset,Mode) на _lseeki64(_fileno(File), Offset, Mode), > то если первая функция сдвигает file pointer в File, то вторая ничего не > делает... Я пытаюсь искусственно это сделать с помощью fsetpos(File, > &pos)... Пока не очень получается, правда... fsetpos() для таких целей > нудно использовать? как, вообще, правильно ее применить? > > В смысле не нудно, а нужно
(long) Offset = 32 бита на 32-х разрадной архитектуре
у меня есть такая функция
int fseeko(FILE *stream, off_t offset, int whence);
Еще вопрос, зачем тебе понадобились file descriptor'ы, если у тебя все
нормально работает через потоки FILE*?
Если же у тебя наоборот есть готовый file descriptor, то приведи его к
потоку функцией fdopen.
Вообще в MS для работы с файлами предусмотрены свои функции.
Еще совет, воспользуйся функцией perror("") сразу после вызовов функций
open, lseek и прочих. Эти диагностические сообщения помогут понять причину
проблем. При успешнои завершении она выдаст Susccessful или что-то в этом
роде, или сообщение об ошибке.
И вообще скинь хоть пример какой.
Posted via RSDN NNTP Server 2.1 beta
Re[9]: _open() выдает ошибку E2BIG - Argument list too long
Здравствуйте, Alexander Pazdnikov, Вы писали:
AP>(long) Offset = 32 бита на 32-х разрадной архитектуре
AP>у меня есть такая функция AP>int fseeko(FILE *stream, off_t offset, int whence);
AP>Еще вопрос, зачем тебе понадобились file descriptor'ы, если у тебя все AP>нормально работает через потоки FILE*? AP>Если же у тебя наоборот есть готовый file descriptor, то приведи его к AP>потоку функцией fdopen.
У меня есть потоки FILE*, но функции которые работаюс с int64 сдвигами и с FILE* есть только в VS8.0, а в VS7 такие функции есть только для file descriptor. Открыть файл функцией _open() у меня не получилось, т.к. функция возвращает ошибку E2BIG. И как оказалось это происходит не из-за размеров файла. К своему ужасу я только, вот, что обнаружил, что и _fileno() возвращает тот же код ошибки вместо дескриптора. Ну, не хотят эти функции работать с бинарным XML и все тут... Что делать ума не приложу!?
Re[6]: _open() выдает ошибку E2BIG - Argument list too long
Здравствуйте, Alexander Pazdnikov, Вы писали:
AP>Mechanic55 wrote:
>> В msdn вот что написано про open(): >> This POSIX function is deprecated beginning in Visual C++ 2005. Use the >> ISO C++ conformant _open instead. AP>О....ть!!! AP>А в MS случаем функцией FileOpen или OpenFile может надо пользоваться, по AP>крайней мере когда с com-портами там работал, то пользовал именно эту AP>функцию, но не open(POSIX). AP>MS, скорее всего, POSIX совсем решили задвинуть потихоньку.
В данном Microsoft действует в соответствии со стандартом ISO, который не допускает наличие в стандартной библиотеке левых функций, если их имя не начинается с подчеркивания.
--
Sergey Chadov
... << RSDN@Home 1.2.0 alpha rev. 685>>
Re[9]: _open() выдает ошибку E2BIG - Argument list too long
Здравствуйте, Alexander Pazdnikov, Вы писали:
AP>(long) Offset = 32 бита на 32-х разрадной архитектуре
AP>у меня есть такая функция AP>int fseeko(FILE *stream, off_t offset, int whence);
AP>Еще вопрос, зачем тебе понадобились file descriptor'ы, если у тебя все AP>нормально работает через потоки FILE*? AP>Если же у тебя наоборот есть готовый file descriptor, то приведи его к AP>потоку функцией fdopen.
AP>Вообще в MS для работы с файлами предусмотрены свои функции.
AP>Еще совет, воспользуйся функцией perror("") сразу после вызовов функций AP>open, lseek и прочих. Эти диагностические сообщения помогут понять причину AP>проблем. При успешнои завершении она выдаст Susccessful или что-то в этом AP>роде, или сообщение об ошибке.
AP>И вообще скинь хоть пример какой.
Александр, извини за потраченное время... Это я откровенно тормознул с _open()... Я думал, что 7 – это код ошибки она мне возвращает, а file descriptor наподобии handle для окна... Вобщем, все там нормально... Зато подразобрался в теме
Re[10]: _open() выдает ошибку E2BIG - Argument list too long