将Google Drive API与Jav​​a配合使用,如何仅列出驱动器部分/文件夹中的文件

时间:2016-05-01 17:05:10

标签: java google-drive-api

我正在尝试获取Google云端硬盘特定部分(驱动器部分)中的所有文件。

这些是我要找的文件:

enter image description here

您可以看到名为Projet 3的文件夹和名为Processus TP2 questions的文件。在文件夹中我只有一个文件。

但是当我尝试列出所有文件时,我收到了数千个文件。如果我使用Google云端硬盘顶部的搜索栏搜索它们,它会找到它们,但我不知道它们在哪里(也许是Gmail附件?)。

这是我的搜索查询:

FileList result = service.files().list()
    
    .setQ("mimeType != 'application/vnd.google-apps.folder' 
            and trashed = false")
    
    .setSpaces("drive")
    .setFields("nextPageToken, files(id, name, parents)")
    .setPageToken(pageToken)
    
    .execute();

如何仅列出我在网络用户界面的驱动器部分/文件夹中可以看到的文件?

非常感谢。

2 个答案:

答案 0 :(得分:6)

在查询中使用“parents”属性,如下所示:

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;

import java.util.AbstractMap;
import java.util.HashMap;
import java.util.Map;

public class Test {

    public static void main(String[] args) {

        Map<String,String> map = new HashMap<String,String>();
        map.put("name","chris");
        map.put("island","faranga");

        XStream magicApi = new XStream();
        magicApi.registerConverter(new MapEntryConverter());
        magicApi.alias("root", Map.class);

        String xml = magicApi.toXML(map);
        System.out.println("Result of tweaked XStream toXml()");
        System.out.println(xml);

        Map<String, String> extractedMap = (Map<String, String>) magicApi.fromXML(xml);
        assert extractedMap.get("name").equals("chris");
        assert extractedMap.get("island").equals("faranga");

    }

    public static class MapEntryConverter implements Converter {

        public boolean canConvert(Class clazz) {
            return AbstractMap.class.isAssignableFrom(clazz);
        }

        public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) {

            AbstractMap map = (AbstractMap) value;
            for (Object obj : map.entrySet()) {
                Map.Entry entry = (Map.Entry) obj;
                writer.startNode(entry.getKey().toString());
                Object val = entry.getValue();
                if ( null != val ) {
                    writer.setValue(val.toString());
                }
                writer.endNode();
            }

        }

        public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {

            Map<String, String> map = new HashMap<String, String>();

            while(reader.hasMoreChildren()) {
                reader.moveDown();

                String key = reader.getNodeName(); // nodeName aka element's name
                String value = reader.getValue();
                map.put(key, value);

                reader.moveUp();
            }

            return map;
        }

    }

}

如果要列出特定文件夹而不是root的内容 - 请在查询中使用该文件夹的id而不是“root”。

答案 1 :(得分:1)

您实际上可以通过发送包含Files: list中给出的所有适用参数的HTTP请求来检索文件列表。

此示例代码在文档中给出:

private static List<File> retrieveAllFiles(Drive service) throws IOException {
    List<File> result = new ArrayList<File>();
    Files.List request = service.files().list();

    do {
      try {
        FileList files = request.execute();

        result.addAll(files.getItems());
        request.setPageToken(files.getNextPageToken());
      } catch (IOException e) {
        System.out.println("An error occurred: " + e);
        request.setPageToken(null);
      }
    } while (request.getPageToken() != null &&
             request.getPageToken().length() > 0);

    return result;
  }

除此之外,您可能需要考虑使用可用的范围,例如请求完整的驱动器范围,因为您需要列出或重新组织用户驱动器中的文件,如Choose Auth Scopes中所述。

请求格式:

(https://www.googleapis.com/auth/drive)