Есть ли проблема адресации для написания FTP-клиента, которому нужно загружать файлы размером более 4 гигабайт? - PullRequest
3 голосов
/ 21 января 2011

Если мой FTP-клиент намеревается выгружать файлы размером более 4 гигабайтов, при условии, что я передаю данные в потоковом режиме, мой указатель попадет на стену со скоростью около 4 гигабайт, если это 32-битный указатель, верно?Я пытаюсь представить, что происходит за кулисами, и не могу представить, как это могло бы работать ... однако это ДОЛЖНО работать, поскольку в прошлом я загружал файлы большего размера.

Итак,у меня вопрос в два раза ... что происходит на клиенте (и должен ли он быть 64-битным клиентом, на 64-битной машине) и что происходит на сервере (и должен ли он также быть 64-битной машиной?)

Я понимаю, что файл будет разбит на более мелкие файлы для передачи, но разве программа не взорвется, просто пытаясь обратиться к частям файла за отметкой 4 294 967 295?

Я думаю, что это связанный пост, но я не уверен, к какому выводу они приходят.Кажется, что ответы указывают как на ограничения указателя (в их случае PERL), так и на ОС. Почему моя программа Perl не может создавать файлы размером более 4 ГБ в Windows?

Ответы [ 3 ]

9 голосов
/ 21 января 2011

Клиент или сервер должны читать данные порциями (я бы сделал кратные размеру страницы или что-то подобное) и записывать порции на диск. Нет необходимости иметь весь файл в оперативной памяти одновременно.

Что-то вроде этого псевдо-кода (проверка ошибок и аналогичные опущены) на принимающей стороне:

chunk = new byte[4096];
while(int size = recv(socket, chunk, 4096)) {
    write(file, chunk, size);
}

Таким образом, приведенный выше пример для сервера, клиент будет делать то же самое.

chunk = new byte[4096];
while(int size = read(file, chunk, 4096)) {
    send(sock, chunk, size);
}

EDIT:

Чтобы ответить на ваш комментарий. Следует иметь в виду, что смещение в файле не обязательно должно быть 32-разрядным в 32-разрядной системе, оно может быть 64-разрядным, поскольку на самом деле это не указатель, а просто смещение от начало файла. Если ОС поддерживает 64-битные смещения (и все современные windows / linux / osx поддерживают), вам не нужно об этом беспокоиться. Как уже отмечалось, файловая система, к которой пытается обратиться ОС, также является фактором, но я полагаю, что если у вас есть файл, размер которого превышает 4 ГБ, он явно находится в файловой системе, которая его поддерживает; -).

3 голосов
/ 21 января 2011

Я думаю, что ваша путаница может возникнуть из-за перегруженного использования слова «указатель». Указатель текущей позиции файла не совпадает с указателем на объект в памяти. Современные 32-битные ОС прекрасно поддерживают 64-битные файловые указатели.

2 голосов
/ 21 января 2011

32 или 64-битный клиент не имеет никакого отношения к размеру файла, 32-битная ОС поддерживает файлы размером более 4 ГБ, единственное, что нужно, это должна поддерживать соответствующая файловая система.FAT16 не поддерживает файлы размером более 4 ГБ, однако FAT32 и NTFS поддерживают.

Каждый программный SDK поддерживает 64-битную адресацию файлов, даже в 32-битной операционной системе.Таким образом, даже если у вас есть 32-битный сервер и клиент, вы все равно можете передавать файл более 4 ГБ.

Дескриптор файла, используемого в программе, поддерживает LONG целое число (8 байт), http://www.cplusplus.com/reference/clibrary/cstdio/ftell/, вы можете видеть, чтоВ большинстве систем длина составляет 8 байт.

Однако, если ваш SDK или ОС поддерживает только 32-битные файловые указатели, у вас есть проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...