4D-jp 4D Japan Technical Support Team

macOS固有のフォルダを排除したZIPファイルを作成する方法

2023-06-28

macOS上でZIPに圧縮したフォルダーをWindowsでフォルダーで展開するとmacOS固有の特殊なフォルダーが問題になることがあります。

macOSには固有の情報を収めた__MACOSX.DS_Storeという名称のフォルダが生成されることがあります。 このフォルダは、Finderでは表示されないのでmacOSでは普段目にすることはありませんが、フォルダーをZIPで圧縮してWindowsでフォルダーを展開すると、これらのフォルダーが可視化されて問題になることがあります。 また、.DS_Storeのようにドットで始まるフォルダーやオブジェクトはWindowsで利用されるディスクフォーマットの種類によっては禁じられているので、OS的にも問題になることがあります。

そこで、これらのフォルダーがZIPファイルに入らないようにする方法を紹介します。

方法その1

一つ目の方法は、ZIP圧縮する前に、問題のフォルダーを削除する方法になります。

まずは、コードをご覧ください。

#DECLARE($path : Text)  //引数定義

If (Is macOS) & (Test path name($path)=Is a folder)
	$origin:=Folder($path; fk platform path)  //圧縮元フォルダーのフォルダーオブジェクトを取得
	$folders:=$origin.folders(fk recursive)  //内包するフォルダーのリストを取得
	$folders:=$folders.query("fullName = '__MACOSX' or fullName = '.DS_Store'")  //問題のフォルダーだけのリストにする
	For each ($folder; $folders)  //リストをループして処理する
		$status:=$folder.delete()  //フォルダーを削除
	End for each 
	$destination:=File($origin.parent.path+$origin.name+".zip")  //圧縮先ファイルは元となるフォルダーと同階層に作成
	$status:=ZIP Create archive($origin; $destination)  //ZIP圧縮する
End if 

#DECLAREが使われていることからおわかりかと思いますが、このコードはプロジェクトメソッドとして利用するように記述されています。 引数は1つだけで、圧縮するフォルダーのプラットフォーム形式のパスになります。

このコードが記述されたメソッドにプラットフォーム形式のパスを渡しますと、圧縮しようとするフォルダーから、まず問題のフォルダーを削除した後に圧縮を行います。

このコードの長所は、4D標準のコマンドだけで組み立てられているので、メンテナンスがし易いことがあります。

一方、このコードには短所と言うよりも欠点に近いものがあります。 このコードは、圧縮元のフォルダーを更新しますので、圧縮元フォルダーのアクセス権が不十分ですと更新ができず、エラーになることがあります。

方法その2

二つ目の方法は、ZIP圧縮したファイルの中から、不要なフォルダーを削除する方法になります。

まずは、コードをご覧ください。

#DECLARE($path : Text)  //引数定義

If (Is macOS) & (Test path name($path)=Is a folder)
	$origin:=Folder($path; fk platform path)  //圧縮元フォルダーのフォルダーオブジェクトを取得
	$destination:=File($origin.parent.path+$origin.name+".zip")  //圧縮先ファイルは元となるフォルダーと同階層に作成
	$status:=ZIP Create archive($origin; $destination)  //ZIP圧縮する
	LAUNCH EXTERNAL PROCESS("zip --delete \""+$destination.path+"\" \"*__MACOSX*\" \"*.DS_Store*\"")  //ZIPファイル内から.DS_Store/__MACOSXフォルダーを削除
End if 

このコードも、前述のコードと同様にプロジェクトメソッドとして利用するように記述されています。

このコードが記述されたメソッドにプラットフォーム形式のパスを渡しますと、圧縮しようとするフォルダーを素直に圧縮します。 その後に、OS標準のzipコマンドを使い、圧縮されたファイルから問題のフォルダーを削除します。

このコードの長所は、圧縮元のフォルダーの内容を変更することはありませんので、読み込み可能なフォルダーであれば圧縮することができます。

このコードの短所は、OS標準のzipコマンドを利用していますので、zipコマンドの仕様変更等には注意が必要です。 とはいえ、zipコマンドは他のOSでも用いられる一般的なコマンドなので、その仕様が変更されることは無いと思います。

まとめ

macOS特有のフォルダーは、他のOSとファイル交換をする際には注意が必要です。 さらに応用して、他社とのZIPファイルに不要な情報が混じらないようにすることにも利用できると思います。