すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:ディレクトリの管理

最終更新日:Dec 15, 2023

Object Storage Service (OSS) は、従来のファイルシステムでデータを保存するために使用されていた階層構造ではなく、フラット構造を使用します。 OSS内のすべてのデータはオブジェクトとしてバケットに保存されます。 便宜上、OSSコンソールは、名前がスラッシュ (/) で終わるオブジェクトを、ファイルシステムのフォルダーに似たディレクトリとして表示します。 ディレクトリを使用して、オブジェクトを階層的に整理およびグループ化し、アクセス制御を容易にします。

使用上の注意

  • このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 OSSと同じリージョンにある他のAlibaba Cloudサービスを使用してOSSにアクセスする場合は、内部エンドポイントを使用します。 OSSでサポートされているリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。

  • このトピックでは、アクセス資格情報は環境変数から取得します。 アクセス資格情報の設定方法の詳細については、「アクセス資格情報の設定」をご参照ください。

  • このトピックでは、OSSエンドポイントを使用してOSSClientインスタンスを作成します。 カスタムドメイン名またはSecurity Token Service (STS) を使用してOSSClientインスタンスを作成する場合は、「OSSClientインスタンスの作成」をご参照ください。

ディレクトリの作成

次のサンプルコードでは、ディレクトリを作成する2つの方法を示します。

com.aliyun.oss.ClientExceptionをインポートします。com.aliyun.oss.OSSをインポートします。impor t com.aliyun.oss.com mon.auth.*;
com.aliyun.oss.OSSClientBuilderをインポートします。com.aliyun.oss.OSSExceptionをインポートします。java.io.ByteArrayInputStreamをインポートします。public classデモ {

    public static void main(String[] args) throws Exception {
        // この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。 
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // バケットの名前を指定します。 例: examplebucket. 
        String bucketName = "examplebucket";
        // 方法1を使用して作成するディレクトリの名前を指定します。 
        文字列dirName = "exampledir/";
        // 方法2を使用して作成するディレクトリの名前を指定します。 
        文字列dirName2 = "exampledir1/";

        // Create an OSSClient instance. 
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

        try {
            // 方法1: CreateDirectory操作を呼び出してディレクトリを作成します。 // ディレクトリを作成する前に、バケットの階層名前空間機能を有効にします。 
            ossClient.createDirectory(bucketName、dirName);

            // 方法2: 空の文字列をアップロードしてディレクトリを作成します。 
            ossClient.putObject(bucketName, dirName2, new ByteArrayInputStream("".getBytes()));
        } catch (Exception e) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "しかし、何らかの理由でエラー応答で拒否されました。");
            System.out.println("エラーメッセージ:" + oe.getErrorMessage());
            System.out.println("エラーコード:" + oe.getErrorCode());
            System.out.println("リクエストID:" + oe.getRequestId());
            System.out.println("ホストID:" + oe.getHostId());
        } catch (ClientException e) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + 「ネットワークにアクセスできないなど」;
            System.out.println("エラーメッセージ:" + ce.getMessage());
        } 最後に{
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

ディレクトリの名前変更

バケットの階層名前空間機能を有効にすると、バケット内のディレクトリの名前を変更できます。

次のサンプルコードは、examplebucketバケット内のexampledirディレクトリの名前をnewexampledirに変更する方法の例を示しています。

com.aliyun.oss.ClientExceptionをインポートします。com.aliyun.oss.OSSをインポートします。impor t com.aliyun.oss.com mon.auth.*;
com.aliyun.oss.OSSClientBuilderをインポートします。com.aliyun.oss.OSSExceptionをインポートします。com.aliyun.oss.mo delをインポートします。*;

public classデモ {

    public static void main(String[] args) throws Exception {
        // バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 
        String endPoint = "yourEndpoint";
        // 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // バケットの名前を指定します。 例: examplebucket. 
        String bucketName = "examplebucket";
        // ソースディレクトリの絶対パスを指定します。 絶対パスにバケット名を含めないでください。 
        文字列sourceDir = "exampledir";
        // ソースディレクトリと同じバケットにある宛先ディレクトリの絶対パスを指定します。 絶対パスにバケット名を含めないでください。 
        文字列destinationDir = "newexampledir";

        // Create an OSSClient instance. 
        OSS ossClient = new OSSClientBuilder().build(endPoint, credentialsProvider);

        try {
            // ソースディレクトリの絶対パスを宛先ディレクトリのパスに変更します。 
            RenameObjectRequest renameObjectRequest = new RenameObjectRequest(bucketName, sourceDir, destinationDir);
            ossClient.renameObject(renameObjectRequest);
        } catch (Exception e) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "しかし、何らかの理由でエラー応答で拒否されました。");
            System.out.println("エラーメッセージ:" + oe.getErrorMessage());
            System.out.println("エラーコード:" + oe.getErrorCode());
            System.out.println("リクエストID:" + oe.getRequestId());
            System.out.println("ホストID:" + oe.getHostId());
        } catch (ClientException e) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + 「ネットワークにアクセスできないなど」;
            System.out.println("エラーメッセージ:" + ce.getMessage());
        } 最後に{
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

ディレクトリの削除

警告

ディレクトリを削除すると、ディレクトリ内のサブディレクトリとすべてのオブジェクトが同期的に削除されます。 ディレクトリを削除するときは注意が必要です。

非再帰的削除または再帰的削除メソッドを使用して、バケットから指定されたディレクトリを削除できます。

非再帰的削除

非再帰的deleteメソッドを使用してディレクトリを削除する場合、ディレクトリが空の場合にのみディレクトリを削除できます。

次のサンプルコードは、非再帰的deleteメソッドを使用してexamplebucketからexampledirディレクトリを削除する方法の例を示しています。

com.aliyun.oss.ClientExceptionをインポートします。com.aliyun.oss.OSSをインポートします。impor t com.aliyun.oss.com mon.auth.*;
com.aliyun.oss.OSSClientBuilderをインポートします。com.aliyun.oss.OSSExceptionをインポートします。com.aliyun.oss.mo delをインポートします。*;

public classデモ {

    public static void main(String[] args) throws Exception {
        // バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 
        String endPoint = "yourEndpoint";
        // 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // バケットの名前を指定します。 
        String bucketName = "examplebucket";
        // ディレクトリの絶対パスを指定します。 絶対パスにバケット名を含めないでください。 
        文字列directoryName = "exampledir";

        // Create an OSSClient instance. 
        OSS ossClient = new OSSClientBuilder().build(endPoint, credentialsProvider);

        try {
            // ディレクトリを削除します。 デフォルトでは、非再帰的deleteメソッドが使用されます。 すべてのオブジェクトとサブディレクトリがこのディレクトリから削除されていることを確認します。 このメソッドを使用してディレクトリを削除する前に、階層名前空間機能を有効にする必要があります。 
            DeleteDirectoryRequest deleteDirectoryRequest = new DeleteDirectoryRequest(bucketName, directoryName);
            DeleteDirectoryResult deleteDirectoryResult = ossClient.de leteDirectory(deleteDirectoryRequest);

            // 削除されたディレクトリの絶対パスを表示します。 
            System.out.println("delete dir name :" + deleteDirectoryResult.getDirectoryName());
            // 削除されたオブジェクトとディレクトリの総数を表示します。 
            System.out.println("delete number:" + deleteDirectoryResult.getDeleteNumber());
        } catch (Exception e) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "しかし、何らかの理由でエラー応答で拒否されました。");
            System.out.println("エラーメッセージ:" + oe.getErrorMessage());
            System.out.println("エラーコード:" + oe.getErrorCode());
            System.out.println("リクエストID:" + oe.getRequestId());
            System.out.println("ホストID:" + oe.getHostId());
        } catch (ClientException e) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + 「ネットワークにアクセスできないなど」;
            System.out.println("エラーメッセージ:" + ce.getMessage());
        } 最後に{
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

再帰的削除

再帰的削除メソッドを使用してディレクトリを削除すると、ディレクトリ内のオブジェクトとサブディレクトリも削除されます。 注意して進めてください。

次のサンプルコードは、再帰的削除メソッドを使用して、examplebucketバケットから指定されたディレクトリとそのディレクトリ内のオブジェクトおよびサブディレクトリを削除する方法の例を示しています。

com.aliyun.oss.ClientExceptionをインポートします。com.aliyun.oss.OSSをインポートします。impor t com.aliyun.oss.com mon.auth.*;
com.aliyun.oss.OSSClientBuilderをインポートします。com.aliyun.oss.OSSExceptionをインポートします。com.aliyun.oss.mo delをインポートします。*;
java.io.UnsupportedEncodingExceptionをインポートします。impor t java.net.URLDecoder;
java.util.ArrayListをインポートします。java.util.Listをインポートします。public classデモ {

    public static void main(String[] args) throws Exception {
        // この例では、中国 (杭州) リージョンのエンドポイントが使用されます。 実際のエンドポイントを指定します。 
        String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
        // 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
        EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
        // バケットの名前を指定します。 例: examplebucket. 
        String bucketName = "examplebucket";
        // ディレクトリの絶対パスを指定します。 絶対パスにバケット名を含めないでください。 
        文字列directoryName = "exampledir";
        // 削除するディレクトリのフルパスを指定します。 バケット名をフルパスに含めないでください。 
        final String prefix = "exampledir/";

        // Create an OSSClient instance. 
        OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);

        try {
            // メソッド1: deleteDirectory再帰削除メソッドを使用してディレクトリを削除します。 このメソッドを使用してディレクトリを削除する前に、階層名前空間機能を有効にする必要があります。 
            DeleteDirectoryRequest deleteDirectoryRequest = new DeleteDirectoryRequest(bucketName, directoryName);
            deleteDirectoryRequest.setDeleteRecursive(true);
            DeleteDirectoryResult deleteDirectoryResult = ossClient.de leteDirectory(deleteDirectoryRequest);

            // 削除結果を表示します。 
            // 一度に最大100のディレクトリとオブジェクトを削除できます。 ディレクトリとオブジェクトの一部のみが削除された場合、サーバーはnextDeleteTokenを返します。 nextDeleteTokenを使用して、残りのデータを引き続き削除できます。 
            // nextDeleteTokenは、次の削除操作が開始されるオブジェクトまたはディレクトリをサーバーが見つけるのに役立ちます。 
            文字列nextDeleteToken = deleteDirectoryResult.getNextDeleteToken();
            System.out.println("delete next token:" + nextDeleteToken);
            // 削除されたディレクトリの絶対パスを表示します。 
            System.out.println("delete dir name :" + deleteDirectoryResult.getDirectoryName());
            // 削除されたオブジェクトとディレクトリの総数を表示します。 
            System.out.println("delete number:" + deleteDirectoryResult.getDeleteNumber());


            // メソッド2: listObjectsメソッドを使用して、ディレクトリとディレクトリ内のすべてのオブジェクトをトラバースして削除します。 
            String nextMarker = null;
            ObjectListing objectListing = null;
            do {
                ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName)
                        . withPrefix(prefix)
                        . withMarker(nextMarker);

                objectListing = ossClient.listObjects(listObjectsRequest);
                if (objectListing.getObjectSummaries().size() > 0) {
                    List<String> keys = new ArrayList<String>();
                    for (OSSObjectSummary s : objectListing.getObjectSummaries()) {
                        System.out.println("key name: " + s.getKey());
                        keys.add(s.getKey());
                    }
                    DeleteObjectsRequest deleteObjectsRequest = new DeleteObjectsRequest(bucketName).withKeys(keys).withEncodingType("url");
                    DeleteObjectsResult deleteObjectsResult = ossClient.de leteObjects(deleteObjectsRequest);
                    List<String> deletedObjects = deleteObjectsResult.getDeletedObjects();
                    try {
                        for(String obj : deletedObjects) {
                            文字列deleteObj = URLDecoder.deコード (obj、"UTF-8");
                            System.out.println(deleteObj);
                        }
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    }
                }

                nextMarker = objectListing.getNextMarker();
            } while (objectListing.isTruncated());
        } catch (Exception e) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "しかし、何らかの理由でエラー応答で拒否されました。");
            System.out.println("エラーメッセージ:" + oe.getErrorMessage());
            System.out.println("エラーコード:" + oe.getErrorCode());
            System.out.println("リクエストID:" + oe.getRequestId());
            System.out.println("ホストID:" + oe.getHostId());
        } catch (ClientException e) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + 「ネットワークにアクセスできないなど」;
            System.out.println("エラーメッセージ:" + ce.getMessage());
        } 最後に{
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
    }
}

参考資料

  • ディレクトリを作成するために呼び出すAPI操作の詳細については、「PutObjectおよびCreateDirectory」をご参照ください。

  • ディレクトリの名前を変更するために呼び出すAPI操作の詳細については、「名前変更」をご参照ください。

  • ディレクトリを削除するために呼び出すAPI操作の詳細については、「DeleteObjectおよびDeleteDirectory」をご参照ください。