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ファイルに不要な情報が混じらないようにすることにも利用できると思います。