Получить размер файла при загрузке по FTP

#objective-c #ios #ftp #filesize #cfreadstream

#objective-c #iOS #ftp #размер файла #cfreadstream

Вопрос:

я тестирую проект «SimpleFTPSample» от Apple, чтобы понять, как работает ftp с iOS. я добавил две строки в «getController.m», чтобы получить размер файла для загрузки.

 -(void)_startReceive
{
.
.
.
  // Open a CFFTPStream for the URL.
  ftpStream = CFReadStreamCreateWithFTPURL(NULL, (CFURLRef) url);
  CFReadStreamSetProperty(ftpStream, kCFStreamPropertyFTPFetchResourceInfo, kCFBooleanTrue); // Added: To get file size
.
.
.
}

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
{
.
.
.
  switch (eventCode) {
    case NSStreamEventOpenCompleted: {
      // Added: Finally get filesize
      fileSize = [[self.networkStream propertyForKey:(id)kCFStreamPropertyFTPResourceSize] integerValue]; 
      [self _updateStatus:@"Opened connection"];
    } break;
.
.
.
}
  

теперь я получаю правильный размер файла (fileSize), но после этого загрузка не начнется. обращение «NSStreamEventHasBytesAvailable» не будет обработано. как я могу заставить это работать? в чем ошибка? я хочу показать индикатор выполнения для состояния загрузки — поэтому мне нужен полный размер файла раньше.

я надеюсь, вы сможете мне помочь с этим. Спасибо!

Ответ №1:

Я почти уверен, что когда вы устанавливаете kCFStreamPropertyFTPFetchResourceInfo, это означает, что вас интересует только размер ресурсов в этом конкретном запросе.

вероятно, вам следует создать новый контроллер, являющийся подклассом getController, назвать его StatController … переопределить _startReceive и обработчик потока для ваших новых методов.

используйте StatController, чтобы получить размер ресурса перед началом асинхронной загрузки.

Ответ №2:

Чтобы получить размер файла, вам просто нужно:

 case NSStreamEventOpenCompleted: {
      fileSize = [[self.networkStream propertyForKey:(id)kCFStreamPropertyFTPResourceSize] integerValue];}
  

Кстати, вы знаете, как получить дату изменения файла на ftp-сервере??

Комментарии:

1. Я получаю fileSize = 0. означает ли это, что файл существует ..?