_open() выдает ошибку E2BIG - Argument list too long
От: Mechanic55  
Дата: 03.09.07 14:04
Оценка:
Всем привет!

Я использую функцию _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
От: Alexander Pazdnikov  
Дата: 04.09.07 04:53
Оценка:
Mechanic55 wrote:


> Как обойти это? Мне именно с 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
От: Mechanic55  
Дата: 04.09.07 08:46
Оценка:
Здравствуйте, 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
От: Alexander Pazdnikov  
Дата: 04.09.07 09:07
Оценка:
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
От: Mechanic55  
Дата: 04.09.07 10:03
Оценка:
Здравствуйте, 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
От: Alexander Pazdnikov  
Дата: 04.09.07 10:21
Оценка:
> В структуре 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
От: Mechanic55  
Дата: 04.09.07 10:23
Оценка:
Здравствуйте, 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
От: Alexander Pazdnikov  
Дата: 04.09.07 10:24
Оценка:
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
От: Mechanic55  
Дата: 04.09.07 10:24
Оценка:
Здравствуйте, Alexander Pazdnikov, Вы писали:

>> В структуре FILE _file — это случайно не

>> file descriptor? Его нельзя задействовать в _lseeki64() и _telli64()?
AP>Можно — это file descriptor, только нужно его получить через функцию
AP>fileno(FILE *); для корректности.

Суперрррр!!!! Ща мы ее
Re[5]: _open() выдает ошибку E2BIG - Argument list too long
От: Alexander Pazdnikov  
Дата: 04.09.07 10:27
Оценка:
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
От: Mechanic55  
Дата: 04.09.07 16:44
Оценка:
Здравствуйте, 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  
Дата: 04.09.07 16:46
Оценка:
Здравствуйте, 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
От: Alexander Pazdnikov  
Дата: 05.09.07 05:25
Оценка:
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
От: Mechanic55  
Дата: 05.09.07 12:35
Оценка:
Здравствуйте, 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
От: Sergey Chadov Россия  
Дата: 05.09.07 15:46
Оценка:
Здравствуйте, 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
От: Mechanic55  
Дата: 05.09.07 16:02
Оценка:
Здравствуйте, 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
От: Alexander Pazdnikov  
Дата: 07.09.07 08:51
Оценка:
Mechanic55 wrote:

> Вобщем, все там нормально... Зато

> подразобрался в теме

Ну и хорошо, зато результат есть.
Posted via RSDN NNTP Server 2.1 beta
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.