搜索文件和文件夹

Google Drive API 支持多种文件和文件夹搜索方式。

您可以使用 files.list 方法返回云端硬盘用户的所有或部分文件和文件夹。files.list 方法还可用于检索某些资源方法(例如 files.getfiles.update)所需的 fileId

搜索当前用户“我的云端硬盘”中的所有文件和文件夹

使用不带任何参数的 files.list 方法可返回所有文件和文件夹。

GET https://www.googleapis.com/drive/v3/files

在当前用户的“我的云端硬盘”中搜索特定文件或文件夹

如需搜索一组特定的文件或文件夹,请将查询字符串 q 字段与 files.list 方法结合使用,通过组合一个或多个搜索字词来过滤要返回的文件。

查询字符串包含以下三个部分:

query_term operator values

其中:

  • query_term 是搜索查询字词或字段。

  • operator 指定查询字词的条件。

  • values 是您要用来过滤搜索结果的具体值。

如需查看可用于过滤文件和文件夹的查询字词和运算符,请参阅搜索查询字词和运算符

例如,以下查询字符串通过设置 MIME 类型过滤搜索结果,以便仅返回文件夹:

q: mimeType = 'application/vnd.google-apps.folder'

如需详细了解 MIME 类型,请参阅 Google Workspace 和 Google 云端硬盘支持的 MIME 类型

查询字符串示例

下表列出了一些基本查询字符串的示例。实际代码因您用于搜索的客户端库而异。

您还必须转义文件名中的特殊字符,以确保查询正常运行。例如,如果文件名同时包含撇号 (') 和反斜线 ("\") 字符,请使用反斜线对它们进行转义:name contains 'quinn\'s paper\\essay'

您要查询的内容 示例
名为“hello”的文件 name = 'hello'
文件名包含“hello”和“goodbye”字样的文件 name contains 'hello' and name contains 'goodbye'
文件名不包含“hello”一词 not name contains 'hello'
包含“重要”字样的文件,且位于回收站中 fullText contains 'important' and trashed = true
包含“hello”字样的文件 fullText contains 'hello'
不含“hello”字样的文件 not fullText contains 'hello'
包含“hello world”这个确切字词组的文件 fullText contains '"hello world"'
查询中包含“\&”字符的文件(例如“\authors”) fullText contains '\\authors'
文件夹文件 mimeType = 'application/vnd.google-apps.folder'
非文件夹的文件 mimeType != 'application/vnd.google-apps.folder'
在指定日期之后修改的文件(默认时区为世界协调时间 [UTC]) modifiedTime > '2012-06-04T12:00:00'
在特定日期之后修改的图片或视频文件 modifiedTime > '2012-06-04T12:00:00' and (mimeType contains 'image/' or mimeType contains 'video/')
已加星标的文件 starred = true
集合中的文件(例如,parents 集合中的文件夹 ID) '1234567' in parents
集合中的应用数据文件夹中的文件 'appDataFolder' in parents
用户“test@example.org”拥有所有权的文件 'test@example.org' in owners
用户“test@example.org”拥有写入权限的文件 'test@example.org' in writers
群组“group@example.org”的成员拥有写入权限的文件 'group@example.org' in writers
与名中有“hello”的已获授权用户共享的文件 sharedWithMe and name contains 'hello'
具有对所有应用可见的自定义文件属性的文件 properties has { key='mass' and value='1.3kg' }
具有请求方应用专属自定义文件属性的文件 appProperties has { key='additionalID' and value='8e8aceg2af2ge72e78' }
未与任何人或网域共享的文件(仅限不公开,或与特定用户或群组共享) visibility = 'limited'

使用客户端库过滤搜索结果

以下代码示例展示了如何使用客户端库将搜索结果过滤为 JPEG 文件的文件名和 ID。此示例使用 mimeType 查询字词将结果范围缩小到类型为 image/jpeg 的文件。它还会将 spaces 设置为 drive,以进一步将搜索范围缩小到 云端硬盘空间。当 nextPageToken 返回 null 时,表示没有更多结果。

Java

drive/snippets/drive_v3/src/main/java/SearchFile.java
import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
import com.google.api.services.drive.model.File;
import com.google.api.services.drive.model.FileList;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/* Class to demonstrate use-case of search files. */
public class SearchFile {

  /**
   * Search for specific set of files.
   *
   * @return search result list.
   * @throws IOException if service account credentials file not found.
   */
  public static List<File> searchFile() throws IOException {
           /*Load pre-authorized user credentials from the environment.
           TODO(developer) - See https://developers.google.com/identity for
           guides on implementing OAuth2 for your application.*/
    GoogleCredentials credentials = GoogleCredentials.getApplicationDefault()
        .createScoped(Arrays.asList(DriveScopes.DRIVE_FILE));
    HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
        credentials);

    // Build a new authorized API client service.
    Drive service = new Drive.Builder(new NetHttpTransport(),
        GsonFactory.getDefaultInstance(),
        requestInitializer)
        .setApplicationName("Drive samples")
        .build();

    List<File> files = new ArrayList<File>();

    String pageToken = null;
    do {
      FileList result = service.files().list()
          .setQ("mimeType='image/jpeg'")
          .setSpaces("drive")
          .setFields("nextPageToken, items(id, title)")
          .setPageToken(pageToken)
          .execute();
      for (File file : result.getFiles()) {
        System.out.printf("Found file: %s (%s)\n",
            file.getName(), file.getId());
      }

      files.addAll(result.getFiles());

      pageToken = result.getNextPageToken();
    } while (pageToken != null);

    return files;
  }
}

Python

drive/snippets/drive-v3/file_snippet/search_file.py
import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError


def search_file():
  """Search file in drive location

  Load pre-authorized user credentials from the environment.
  TODO(developer) - See https://developers.google.com/identity
  for guides on implementing OAuth2 for the application.
  """
  creds, _ = google.auth.default()

  try:
    # create drive api client
    service = build("drive", "v3", credentials=creds)
    files = []
    page_token = None
    while True:
      # pylint: disable=maybe-no-member
      response = (
          service.files()
          .list(
              q="mimeType='image/jpeg'",
              spaces="drive",
              fields="nextPageToken, files(id, name)",
              pageToken=page_token,
          )
          .execute()
      )
      for file in response.get("files", []):
        # Process change
        print(f'Found file: {file.get("name")}, {file.get("id")}')
      files.extend(response.get("files", []))
      page_token = response.get("nextPageToken", None)
      if page_token is None:
        break

  except HttpError as error:
    print(f"An error occurred: {error}")
    files = None

  return files


if __name__ == "__main__":
  search_file()

Node.js

drive/snippets/drive_v3/file_snippets/search_file.js
/**
 * Search file in drive location
 * @return{obj} data file
 * */
async function searchFile() {
  const {GoogleAuth} = require('google-auth-library');
  const {google} = require('googleapis');

  // Get credentials and build service
  // TODO (developer) - Use appropriate auth mechanism for your app
  const auth = new GoogleAuth({
    scopes: 'https://www.googleapis.com/auth/drive',
  });
  const service = google.drive({version: 'v3', auth});
  const files = [];
  try {
    const res = await service.files.list({
      q: 'mimeType=\'image/jpeg\'',
      fields: 'nextPageToken, files(id, name)',
      spaces: 'drive',
    });
    Array.prototype.push.apply(files, res.files);
    res.data.files.forEach(function(file) {
      console.log('Found file:', file.name, file.id);
    });
    return res.data.files;
  } catch (err) {
    // TODO(developer) - Handle error
    throw err;
  }
}

PHP

drive/snippets/drive_v3/src/DriveSearchFiles.php
use Google\Client;
use Google\Service\Drive;
function searchFiles()
{
    try {
        $client = new Client();
        $client->useApplicationDefaultCredentials();
        $client->addScope(Drive::DRIVE);
        $driveService = new Drive($client);
        $files = array();
        $pageToken = null;
        do {
            $response = $driveService->files->listFiles(array(
                'q' => "mimeType='image/jpeg'",
                'spaces' => 'drive',
                'pageToken' => $pageToken,
                'fields' => 'nextPageToken, files(id, name)',
            ));
            foreach ($response->files as $file) {
                printf("Found file: %s (%s)\n", $file->name, $file->id);
            }
            array_push($files, $response->files);

            $pageToken = $response->pageToken;
        } while ($pageToken != null);
        return $files;
    } catch(Exception $e) {
       echo "Error Message: ".$e;
    }
}

搜索具有自定义文件属性的文件

如需搜索具有自定义文件属性的文件,请使用 propertiesappProperties 搜索查询字词以及键和值。例如,如需搜索仅对请求应用 additionalID 可见且值为 8e8aceg2af2ge72e78 的自定义文件属性,请执行以下操作:

appProperties has { key='additionalID' and value='8e8aceg2af2ge72e78' }

如需了解详情,请参阅添加自定义文件属性

搜索具有特定标签或字段值的文件

如需搜索带有特定标签的文件,请将 labels 搜索查询字词与特定标签 ID 搭配使用。例如:'labels/LABEL_ID' in labels。如果成功,响应正文将包含应用了标签的所有文件实例。

如需搜索不含特定标签 ID 的文件,请使用 Not 'labels/LABEL_ID' in labels

您还可以根据特定字段值搜索文件。例如,如需搜索文本值为 labels/LABEL_ID.text_field_id ='TEXT' 的文件,请使用以下命令:

如需了解详情,请参阅搜索具有特定标签或字段值的文件

搜索语料库

调用 files.list 的搜索默认使用 usercorpora。如需搜索其他语料库(例如与 domain 共享的文件),请设置 corpora 参数。

您可以在单个查询中搜索多个语料库,但如果合并的语料库太大,系统可能会返回不完整的结果。如果响应正文中的 incompleteSearchtrue,则表示系统未返回所有文档。如果出现这种情况,您应选择其他语料库(例如 userdrive)来缩小查询范围。