2016-07-05 81 views
0

所以我试图使用Google Drive API获取文件和文件夹。IOS GoogleDrive API - 获取1个执行子文件夹中的所有文件

- (void)fetchFilesFrom:(NSString *)folderID remoteFolderPath:(NSString *)folderPath { 

GTLQueryDrive *query = [GTLQueryDrive queryForFilesList]; 
query.q = [NSString stringWithFormat:@"'%@' IN parents", folderID]; // get all files and folders under a parent folder 
query.fields = @"nextPageToken, files(id, name, mimeType, modifiedTime)"; // get files' and folders' name and id only 

[self.serviceDrive executeQuery:query 
       completionHandler:^(GTLServiceTicket *ticket, 
            GTLDriveFileList *fileList, 
            NSError *error) { 
        if (error == nil) { 
         for (GTLDriveFile *file in fileList.files) { 
          if ([file.mimeType containsString:@"vnd.google-apps.folder"]) { // folder not file 
           NSString *subFolderPath = [NSString stringWithFormat:@"%@/%@", folderPath, file.name]; 
           [self.driveDict setValue:file forKey:subFolderPath]; 
           // Create the folder locally if not existing 
           [DocumentHandler checkToCreateDir:subFolderPath]; 
           // Fetch files in a subfolder 
           [self fetchFilesFrom:file.identifier remoteFolderPath:subFolderPath]; 
          }else if(![file.mimeType containsString:@"vnd.google-apps."]) { 
           // Ignore other google files like speadsheet... as they are undownloadable 
           NSString *filePath = [NSString stringWithFormat:@"%@/%@", folderPath, file.name]; 
           [self.driveDict setValue:file forKey:filePath]; 
          } 
         } 

        /* If possible, I want to have the full driveDict here in order to compare. */ 

        } else NSLog(@"An error occurred: %@", error); 
       }]; 

}

上述功能工作正常,但我不希望使用递归循环来获得子文件夹中的所有文件。有没有办法让原始文件及其子文件夹中的所有文件只有一次执行?

我把它带来的原因是我想比较远程文件列表与本地文件列表以删除不必要的本地文件,然后再下载驱动器文件。并且使用executeQuery:completionHandler:^{}块使我无法成功实现串行执行。块内的方法总是在稍后执行。

回答

1

欲了解更多信息和下面的详细步骤是谷歌驱动器的官方网站 https://developers.google.com/drive/ios/quickstart

- (void)fetchFiles { 
    self.output.text = @"Getting files..."; 
    GTLQueryDrive *query = 
    [GTLQueryDrive queryForFilesList]; 
    //query.pageSize = 10; /* Total number of files to get at once But useful only when there are more than hundreds of file to get once.*/ 
    query.fields = @"nextPageToken, files(id, name)"; 
    [self.service executeQuery:query 
       delegate:self 
      didFinishSelector:@selector(displayResultWithTicket:finishedWithObject:error:)]; 
} 
+0

虽然此链接可以回答这个问题,这是更好地在这里包含答案的重要部分并提供链接供参考。如果链接页面更改,则仅链接答案可能会失效。 – Marusyk

+0

在发布我的问题之前,我实际上多次阅读本教程。 – Tim

+0

您可以查看我再次转贴的答案。请让我你需要详细的帮助。我可以一步一步地引导你。 –

0
- (void)fetchFiles { 
    self.output.text = @"Getting files..."; 
    GTLQueryDrive *query = 
    [GTLQueryDrive queryForFilesList]; 
    //query.pageSize = 10; /* Total number of files to get at once But useful only when there are more than hundreds of file to get once.*/ 
    query.fields = @"nextPageToken, files(id, name)"; 
    [self.service executeQuery:query 
       delegate:self 
      didFinishSelector:@selector(displayResultWithTicket:finishedWithObject:error:)]; 
} 

调用此方法来获取所有文件和文件夹中的驱动器的链接。它会在一次调用中列出所有文件夹,包括其子文件夹和文件的文件。一个词在根文件夹中。

0

您的问题与我相同。您可以使用块:)

@property (nonatomic, copy) void(^blockHandler)(id data); 


// get list file 
- (void)listFiles:(NSString *)fileId complete:(void(^)(id data))completion { 
self.blockHandler = completion; 

GTLRDriveQuery_FilesList *query = [GTLRDriveQuery_FilesList query]; 
query.fields = @"nextPageToken, files(id, name, thumbnailLink, webViewLink)"; 
query.pageSize = 1000; 
query.q = [NSString stringWithFormat:@"'%@' In parents and trashed=false",fileId]; 

[self.service executeQuery:query 
        delegate:self 
     didFinishSelector:@selector(displayResultWithTicket:finishedWithObject:error:)]; 
} 

- (void)displayResultWithTicket:(GTLRServiceTicket *)ticket 
     finishedWithObject:(GTLRDrive_FileList *)result 
         error:(NSError *)error { 
if (error == nil) { 
    NSMutableString *output = [[NSMutableString alloc] init]; 
    if (result.files.count > 0) { 
     [output appendString:@"Files:\n"]; 
     for (GTLRDrive_File *file in result.files) { 
      itemGG *temp = [[itemGG alloc] initWithName:file.name linkThumb:file.thumbnailLink fileID:file.identifier]; 
      [self.lstItem addObject:temp]; 
      [output appendFormat:@"%@ (%@)\n", file.name, file.identifier]; 
     } 
    } else { 
     [output appendString:@"No files found."]; 
    } 
    NSLog(@"%@", output); 
} else { 
    NSLog(@"Error getting presentation data: %@\n", error.localizedDescription); 
} 

if (self.blockHandler) { 
    self.blockHandler([[NSArray alloc] initWithArray:self.lstItem]); 
} 
} 


__weak typeof(self) w = self; 
[self.cloud listFiles:@"root" complete:^(id data) { 
    w.tableData = data; 
    [w.myCollection reloadData]; 
}]; 
相关问题