Quản lý bộ nhớ dùng chung

Hướng dẫn này chứa các tác vụ liên quan đến việc quản lý bộ nhớ dùng chung, chẳng hạn như tạo bộ nhớ dùng chung và quản lý thành viên cũng như quyền, bằng cách sử dụng Google Drive API.

Để biết thêm thông tin về giới hạn thư mục trong bộ nhớ dùng chung, hãy xem phần Giới hạn về thư mục.

Tạo bộ nhớ dùng chung

Để tạo bộ nhớ dùng chung, hãy sử dụng phương thức drives.create.

Java

drive/snippets/drive_v3/src/main/java/CreateDrive.java
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
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.DriveScopes;
import com.google.api.services.drive.model.Drive;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.util.Arrays;
import java.util.UUID;

/* class to demonstrate use-case of Drive's create drive. */
public class CreateDrive {

  /**
   * Create a drive.
   *
   * @return Newly created drive id.
   * @throws IOException if service account credentials file not found.
   */
  public static String createDrive() 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));
    HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
        credentials);

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

    Drive driveMetadata = new Drive();
    driveMetadata.setName("Project Resources");
    String requestId = UUID.randomUUID().toString();
    try {
      Drive drive = service.drives().create(requestId,
              driveMetadata)
          .execute();
      System.out.println("Drive ID: " + drive.getId());

      return drive.getId();
    } catch (GoogleJsonResponseException e) {
      // TODO(developer) - handle error appropriately
      System.err.println("Unable to create drive: " + e.getDetails());
      throw e;
    }
  }
}

Python

drive/snippets/drive-v3/drive_snippet/create_drive.py
import uuid

import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError


def create_drive():
  """Create a drive.
  Returns:
      Id of the created drive

  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)

    drive_metadata = {"name": "Project Resources"}
    request_id = str(uuid.uuid4())
    # pylint: disable=maybe-no-member
    drive = (
        service.drives()
        .create(body=drive_metadata, requestId=request_id, fields="id")
        .execute()
    )
    print(f'Drive ID: {drive.get("id")}')

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

  return drive.get("id")


if __name__ == "__main__":
  create_drive()

Node.js

drive/snippets/drive_v3/drive_snippets/create_drive.js
/**
 * Create a drive.
 * */
async function createDrive() {
  // Get credentials and build service
  // TODO (developer) - Use appropriate auth mechanism for your app

  const {GoogleAuth} = require('google-auth-library');
  const {google} = require('googleapis');
  const uuid = require('uuid');

  const auth = new GoogleAuth({
    scopes: 'https://www.googleapis.com/auth/drive',
  });
  const service = google.drive({version: 'v3', auth});

  const driveMetadata = {
    name: 'Project resources',
  };
  const requestId = uuid.v4();
  try {
    const Drive = await service.drives.create({
      resource: driveMetadata,
      requestId: requestId,
      fields: 'id',
    });
    console.log('Drive Id:', Drive.data.id);
    return Drive.data.id;
  } catch (err) {
    // TODO(developer) - Handle error
    throw err;
  }
}

PHP

drive/snippets/drive_v3/src/DriveCreateDrive.php
use Google\Client;
use Google\Service\Drive;
use Ramsey\Uuid\Uuid;
function createDrive()
{
    try {
        $client = new Client();
        $client->useApplicationDefaultCredentials();
        $client->addScope(Drive::DRIVE);
        $driveService = new Drive($client);

        $driveMetadata = new Drive\Drive(array(
                'name' => 'Project Resources'));
        $requestId = Uuid::uuid4()->toString();
        $drive = $driveService->drives->create($requestId, $driveMetadata, array(
                'fields' => 'id'));
        printf("Drive ID: %s\n", $drive->id);
        return $drive->id;
    } catch(Exception $e)  {
        echo "Error Message: ".$e;
    }  

}

.NET

drive/snippets/drive_v3/DriveV3Snippets/CreateDrive.cs
using Google.Apis.Auth.OAuth2;
using Google.Apis.Drive.v3;
using Google.Apis.Drive.v3.Data;
using Google.Apis.Services;

namespace DriveV3Snippets
{
    // Class to demonstrate use of Drive's create drive.
    public class CreateDrive
    {
        /// <summary>
        /// Create a drive.
        /// </summary>
        /// <returns>newly created drive Id.</returns>
        public static string DriveCreateDrive()
        {
            try
            {
                /* Load pre-authorized user credentials from the environment.
                 TODO(developer) - See https://developers.google.com/identity for
                 guides on implementing OAuth2 for your application. */
                GoogleCredential credential = GoogleCredential.GetApplicationDefault()
                    .CreateScoped(DriveService.Scope.Drive);

                // Create Drive API service.
                var service = new DriveService(new BaseClientService.Initializer
                {
                    HttpClientInitializer = credential,
                    ApplicationName = "Drive API Snippets"
                });

                var driveMetadata = new Drive()
                {
                    Name = "Project Resources"
                };
                var requestId = Guid.NewGuid().ToString();
                var request = service.Drives.Create(driveMetadata, requestId);
                request.Fields = "id";
                var drive = request.Execute();
                Console.WriteLine("Drive ID: " + drive.Id);
                return drive.Id;
            }
            catch (Exception e)
            {
                // TODO(developer) - handle error appropriately
                if (e is AggregateException)
                {
                    Console.WriteLine("Credential Not found");
                }
                else
                {
                    throw;
                }
            }
            return null;
        }
    }
}

Các lệnh gọi đến phương thức drives.create là các lệnh gọi bất biến.

Tham số requestId xác định nỗ lực hợp lý để tạo ổ đĩa dùng chung. Nếu yêu cầu hết thời gian chờ hoặc trả về một lỗi phụ trợ không xác định, thì bạn có thể lặp lại yêu cầu đó. requestId và nội dung của yêu cầu phải giữ nguyên.

Nếu bộ nhớ dùng chung được tạo thành công trong một yêu cầu trước đó hoặc do một lần thử lại, thì phản hồi thông thường sẽ được trả về. Đôi khi, chẳng hạn như sau một thời gian dài hoặc nếu nội dung yêu cầu đã thay đổi, thì có thể trả về lỗi 409 cho biết bạn phải loại bỏ requestId.

Thêm hoặc xoá thành viên bộ nhớ dùng chung

Thêm hoặc xoá thành viên bộ nhớ dùng chung bằng tài nguyên permissions.

Để thêm thành viên, hãy tạo quyền trên bộ nhớ dùng chung. Bạn cũng có thể sử dụng các phương thức cấp quyền cho từng tệp trong bộ nhớ dùng chung để cấp thêm đặc quyền cho các thành viên hoặc cho phép những người không phải là thành viên cộng tác trên các mục cụ thể.

Để biết thêm thông tin và mã mẫu, hãy xem phần Chia sẻ tệp, thư mục và ổ đĩa.

Xoá bộ nhớ dùng chung

Sử dụng phương thức drives.delete để xoá một bộ nhớ dùng chung. Bạn phải chuyển tất cả nội dung trong bộ nhớ dùng chung vào thùng rác hoặc xoá nội dung đó trước khi xoá bộ nhớ dùng chung.

Quản lý bộ nhớ dùng chung cho quản trị viên miền

Áp dụng tham số useDomainAdminAccess với các tài nguyên drivespermissions để quản lý bộ nhớ dùng chung trong một tổ chức.

Người dùng gọi các phương thức này bằng useDomainAdminAccess=true phải có Drive and Docs đặc quyền quản trị viên. Quản trị viên có thể tìm kiếm bộ nhớ dùng chung hoặc cập nhật quyền đối với bộ nhớ dùng chung thuộc sở hữu của tổ chức, bất kể quản trị viên có phải là thành viên của bộ nhớ dùng chung đó hay không.

Khôi phục bộ nhớ dùng chung không có người tổ chức

Ví dụ sau đây minh hoạ cách sử dụng các tài nguyên này để khôi phục ổ đĩa dùng chung không còn người tổ chức.

Java

drive/snippets/drive_v3/src/main/java/RecoverDrive.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.DriveScopes;
import com.google.api.services.drive.model.Drive;
import com.google.api.services.drive.model.DriveList;
import com.google.api.services.drive.model.Permission;
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 Drive's shared drive without an organizer. */
public class RecoverDrive {

  /**
   * Find all shared drives without an organizer and add one.
   *
   * @param realUser User's email id.
   * @return All shared drives without an organizer.
   * @throws IOException if shared drive not found.
   */
  public static List<Drive> recoverDrives(String realUser)
      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));
    HttpRequestInitializer requestInitializer = new HttpCredentialsAdapter(
        credentials);

    // Build a new authorized API client service.
    com.google.api.services.drive.Drive service =
        new com.google.api.services.drive.Drive.Builder(new NetHttpTransport(),
            GsonFactory.getDefaultInstance(),
            requestInitializer)
            .setApplicationName("Drive samples")
            .build();
    List<Drive> drives = new ArrayList<Drive>();

    // Find all shared drives without an organizer and add one.
    // Note: This example does not capture all cases. Shared drives
    // that have an empty group as the sole organizer, or an
    // organizer outside the organization are not captured. A
    // more exhaustive approach would evaluate each shared drive
    // and the associated permissions and groups to ensure an active
    // organizer is assigned.
    String pageToken = null;
    Permission newOrganizerPermission = new Permission()
        .setType("user")
        .setRole("organizer");

    newOrganizerPermission.setEmailAddress(realUser);


    do {
      DriveList result = service.drives().list()
          .setQ("organizerCount = 0")
          .setFields("nextPageToken, drives(id, name)")
          .setUseDomainAdminAccess(true)
          .setPageToken(pageToken)
          .execute();
      for (Drive drive : result.getDrives()) {
        System.out.printf("Found drive without organizer: %s (%s)\n",
            drive.getName(), drive.getId());
        // Note: For improved efficiency, consider batching
        // permission insert requests
        Permission permissionResult = service.permissions()
            .create(drive.getId(), newOrganizerPermission)
            .setUseDomainAdminAccess(true)
            .setSupportsAllDrives(true)
            .setFields("id")
            .execute();
        System.out.printf("Added organizer permission: %s\n",
            permissionResult.getId());

      }

      drives.addAll(result.getDrives());

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

    return drives;
  }
}

Python

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


def recover_drives(real_user):
  """Find all shared drives without an organizer and add one.
  Args:
      real_user:User ID for the new organizer.
  Returns:
      drives object

  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)

    drives = []

    # pylint: disable=maybe-no-member
    page_token = None
    new_organizer_permission = {
        "type": "user",
        "role": "organizer",
        "emailAddress": "user@example.com",
    }
    new_organizer_permission["emailAddress"] = real_user

    while True:
      response = (
          service.drives()
          .list(
              q="organizerCount = 0",
              fields="nextPageToken, drives(id, name)",
              useDomainAdminAccess=True,
              pageToken=page_token,
          )
          .execute()
      )
      for drive in response.get("drives", []):
        print(
            "Found shared drive without organizer: "
            f"{drive.get('title')}, {drive.get('id')}"
        )
        permission = (
            service.permissions()
            .create(
                fileId=drive.get("id"),
                body=new_organizer_permission,
                useDomainAdminAccess=True,
                supportsAllDrives=True,
                fields="id",
            )
            .execute()
        )
        print(f'Added organizer permission: {permission.get("id")}')

      drives.extend(response.get("drives", []))
      page_token = response.get("nextPageToken", None)
      if page_token is None:
        break

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

  return drives


if __name__ == "__main__":
  recover_drives(real_user="gduser1@workspacesamples.dev")

Node.js

drive/snippets/drive_v3/drive_snippets/recover_drives.js
/**
 * Find all shared drives without an organizer and add one.
 * @param{string} userEmail user ID to assign ownership to
 * */
async function recoverDrives(userEmail) {
  // Get credentials and build service
  // TODO (developer) - Use appropriate auth mechanism for your app

  const {GoogleAuth} = require('google-auth-library');
  const {google} = require('googleapis');

  const auth = new GoogleAuth({
    scopes: 'https://www.googleapis.com/auth/drive',
  });
  const service = google.drive({version: 'v3', auth});
  const drives = [];
  const newOrganizerPermission = {
    type: 'user',
    role: 'organizer',
    emailAddress: userEmail, // Example: 'user@example.com'
  };

  let pageToken = null;
  try {
    const res = await service.drives.list({
      q: 'organizerCount = 0',
      fields: 'nextPageToken, drives(id, name)',
      useDomainAdminAccess: true,
      pageToken: pageToken,
    });
    Array.prototype.push.apply(drives, res.data.items);
    for (const drive of res.data.drives) {
      console.log(
          'Found shared drive without organizer:',
          drive.name,
          drive.id,
      );
      await service.permissions.create({
        resource: newOrganizerPermission,
        fileId: drive.id,
        useDomainAdminAccess: true,
        supportsAllDrives: true,
        fields: 'id',
      });
    }
    pageToken = res.nextPageToken;
  } catch (err) {
    // TODO(developer) - Handle error
    throw err;
  }
  return drives;
}

PHP

drive/snippets/drive_v3/src/DriveRecoverDrives.php
use Google\Client;
use Google\Service\Drive;
use Ramsey\Uuid\Uuid;
function recoverDrives()
{
   try {
    $client = new Client();
    $client->useApplicationDefaultCredentials();
    $client->addScope(Drive::DRIVE);
    $driveService = new Drive($client);

    $realUser = readline("Enter user email address: ");

    $drives = array();
    // Find all shared drives without an organizer and add one.
    // Note: This example does not capture all cases. Shared drives
    // that have an empty group as the sole organizer, or an
    // organizer outside the organization are not captured. A
    // more exhaustive approach would evaluate each shared drive
    // and the associated permissions and groups to ensure an active
    // organizer is assigned.
    $pageToken = null;
    $newOrganizerPermission = new Drive\Permission(array(
        'type' => 'user',
        'role' => 'organizer',
        'emailAddress' => 'user@example.com'
    ));
    $newOrganizerPermission['emailAddress'] = $realUser;
    do {
        $response = $driveService->drives->listDrives(array(
            'q' => 'organizerCount = 0',
            'fields' => 'nextPageToken, drives(id, name)',
            'useDomainAdminAccess' => true,
            'pageToken' => $pageToken
        ));
        foreach ($response->drives as $drive) {
            printf("Found shared drive without organizer: %s (%s)\n",
                $drive->name, $drive->id);
            $permission = $driveService->permissions->create($drive->id,
                $newOrganizerPermission,
                array(
                    'fields' => 'id',
                    'useDomainAdminAccess' => true,
                    'supportsAllDrives' => true
                ));
            printf("Added organizer permission: %s\n", $permission->id);
        }
        array_push($drives, $response->drives);
        $pageToken = $response->pageToken;
    } while ($pageToken != null);
    return $drives;
   } catch(Exception $e) {
      echo "Error Message: ".$e;
   }
}

.NET

drive/snippets/drive_v3/DriveV3Snippets/RecoverDrives.cs
using Google.Apis.Auth.OAuth2;
using Google.Apis.Drive.v3;
using Google.Apis.Drive.v3.Data;
using Google.Apis.Services;

namespace DriveV3Snippets
{
    // Class to demonstrate use-case of Drive's shared drive without an organizer.
    public class RecoverDrives
    {
        /// <summary>
        /// Find all shared drives without an organizer and add one.
        /// </summary>
        /// <param name="realUser">User ID for the new organizer.</param>
        /// <returns>all shared drives without an organizer.</returns>
        public static IList<Drive> DriveRecoverDrives(string realUser)
        {
            try
            {
                /* Load pre-authorized user credentials from the environment.
                 TODO(developer) - See https://developers.google.com/identity for
                 guides on implementing OAuth2 for your application. */
                GoogleCredential credential = GoogleCredential.GetApplicationDefault()
                    .CreateScoped(DriveService.Scope.Drive);

                // Create Drive API service.
                var service = new DriveService(new BaseClientService.Initializer
                {
                    HttpClientInitializer = credential,
                    ApplicationName = "Drive API Snippets"
                });

                var drives = new List<Drive>();
                // Find all shared drives without an organizer and add one.
                // Note: This example does not capture all cases. Shared drives
                // that have an empty group as the sole organizer, or an
                // organizer outside the organization are not captured. A
                // more exhaustive approach would evaluate each shared drive
                // and the associated permissions and groups to ensure an active
                // organizer is assigned.
                string pageToken = null;
                var newOrganizerPermission = new Permission()
                {
                    Type = "user",
                    Role = "organizer",
                    EmailAddress = realUser
                };

                do
                {
                    var request = service.Drives.List();
                    request.UseDomainAdminAccess = true;
                    request.Q = "organizerCount = 0";
                    request.Fields = "nextPageToken, drives(id, name)";
                    request.PageToken = pageToken;
                    var result = request.Execute();
                    foreach (var drive in result.Drives)
                    {
                        Console.WriteLine(("Found abandoned shared drive: {0} ({1})",
                            drive.Name, drive.Id));
                        // Note: For improved efficiency, consider batching
                        // permission insert requests
                        var permissionRequest = service.Permissions.Create(
                            newOrganizerPermission,
                            drive.Id
                        );
                        permissionRequest.UseDomainAdminAccess = true;
                        permissionRequest.SupportsAllDrives = true;
                        permissionRequest.Fields = "id";
                        var permissionResult = permissionRequest.Execute();
                        Console.WriteLine("Added organizer permission: {0}", permissionResult.Id);
                    }

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

                return drives;
            }
            catch (Exception e)
            {
                // TODO(developer) - handle error appropriately
                if (e is AggregateException)
                {
                    Console.WriteLine("Credential Not found");
                }
                else
                {
                    throw;
                }
            }
            return null;
        }
    }
}

Ngăn người dùng tải xuống, in hoặc sao chép tệp

Bạn có thể giới hạn cách người dùng tải xuống, in và sao chép tệp trong bộ nhớ dùng chung.

Để xác định xem người dùng có thể thay đổi các hạn chế tải xuống do người tổ chức áp dụng của một bộ nhớ dùng chung hay không, hãy kiểm tra trường boolean capabilities.canChangeDownloadRestriction. Nếu capabilities.canChangeDownloadRestriction được đặt thành true, thì bạn có thể áp dụng các hạn chế tải xuống cho bộ nhớ dùng chung. Để biết thêm thông tin, hãy xem bài viết Tìm hiểu các chức năng của tệp.

Tài nguyên drives chứa một tập hợp các trường boolean restrictions dùng để cho biết liệu một hành động có thể được thực hiện trên bộ nhớ dùng chung hay không. Các quy định hạn chế áp dụng cho bộ nhớ dùng chung hoặc các mục trong bộ nhớ dùng chung. Bạn có thể đặt các quy tắc hạn chế bằng phương thức drives.update.

Để áp dụng hạn chế tải xuống cho một bộ nhớ dùng chung, người quản lý bộ nhớ dùng chung có thể đặt trường restrictions.downloadRestriction của tài nguyên drives bằng cách sử dụng đối tượng DownloadRestriction. Đặt trường boolean restrictedForReaders thành true để khai báo rằng cả hoạt động tải xuống và sao chép đều bị hạn chế đối với người đọc. Việc đặt restrictedForWriterstrường boolean thành true cho biết rằng cả hoạt động tải xuống và sao chép đều bị hạn chế đối với người viết. Xin lưu ý rằng nếu trường restrictedForWriterstrue, thì người đọc cũng sẽ bị hạn chế tải xuống và sao chép. Tương tự, việc đặt restrictedForWriters thành truerestrictedForReaders thành false tương đương với việc đặt cả restrictedForWritersrestrictedForReaders thành true.

Khả năng tương thích ngược

Khi giới thiệu đối tượng DownloadRestriction, chức năng của trường boolean restrictions.copyRequiresWriterPermission đã được cập nhật.

Giờ đây, việc đặt restrictions.copyRequiresWriterPermission thành true sẽ cập nhật trường boolean restrictedForReaders của đối tượng DownloadRestriction thành true để khai báo rằng cả hoạt động tải xuống và sao chép đều bị hạn chế đối với người đọc.

Việc đặt trường copyRequiresWriterPermission thành false sẽ cập nhật cả trường restrictedForWritersrestrictedForReaders thành false. Điều này có nghĩa là chế độ cài đặt hạn chế tải xuống hoặc sao chép sẽ bị xoá đối với tất cả người dùng.

Các trường kiểm soát tính năng tải xuống, in và sao chép

Bảng sau đây liệt kê các trường tài nguyên drives ảnh hưởng đến chức năng tải xuống, in và sao chép:

Trường Mô tả Phiên bản
capabilities.canCopy Người dùng hiện tại có thể sao chép tệp trong bộ nhớ dùng chung hay không. v2 và v3
capabilities.canDownload Liệu người dùng hiện tại có thể tải tệp xuống trong bộ nhớ dùng chung hay không. v2 và v3
capabilities.canChangeCopyRequiresWriterPermission Liệu người dùng hiện tại có thể thay đổi chế độ hạn chế copyRequiresWriterPermission của bộ nhớ dùng chung hay không. v2 và v3
capabilities.canResetDriveRestrictions Liệu người dùng hiện tại có thể đặt lại các hạn chế của bộ nhớ dùng chung về chế độ mặc định hay không. v2 và v3
capabilities.canChangeDownloadRestriction Liệu người dùng hiện tại có thể thay đổi chế độ hạn chế tải xuống của một bộ nhớ dùng chung hay không. Chỉ v3
restrictions.copyRequiresWriterPermission Liệu người đọc và người nhận xét có bị vô hiệu hoá các tuỳ chọn sao chép, in hoặc tải tệp xuống trong bộ nhớ dùng chung hay không. Khi true, chế độ này sẽ đặt trường có tên tương tự thành true cho mọi tệp trong bộ nhớ dùng chung này. v2 và v3
restrictions.downloadRestriction Các quy định hạn chế tải xuống do người quản lý bộ nhớ dùng chung áp dụng. Chỉ v3

Giới hạn về thư mục

Thư mục trong bộ nhớ dùng chung có một số hạn mức bộ nhớ. Để biết thông tin, hãy xem bài viết Hạn mức bộ nhớ dùng chung trong Google Drive.

Giới hạn về mục

Mỗi thư mục trong bộ nhớ dùng chung của người dùng có giới hạn là 500.000 mục, bao gồm cả tệp, thư mục và lối tắt.

Khi đạt đến hạn mức, bộ nhớ dùng chung sẽ không thể chấp nhận thêm mục. Để nhận lại tệp, người dùng phải xoá vĩnh viễn các mục khỏi thư mục. Xin lưu ý rằng các mục trong thùng rác sẽ được tính vào hạn mức, nhưng các mục bị xoá vĩnh viễn thì không. Để biết thêm thông tin, hãy xem bài viết Chuyển vào thùng rác hoặc xoá tệp và thư mục.

Giới hạn về chiều sâu của thư mục

Một thư mục trong bộ nhớ dùng chung không thể chứa quá 100 cấp thư mục được lồng. Điều này có nghĩa là bạn không thể lưu trữ một thư mục con trong một thư mục có độ sâu hơn 99 cấp. Giới hạn này chỉ áp dụng cho các thư mục con.

Nếu bạn cố gắng thêm hơn 100 cấp thư mục, hệ thống sẽ trả về phản hồi mã trạng thái HTTP teamDriveHierarchyTooDeep.