正しい外部の画像ファイルの削除の仕方
2 posters
正しい外部の画像ファイルの削除の仕方
Webになって初めてお邪魔します。
4D Server ver15.2(Mac)で,多くの画像データを4Dデータファイルの外に保存しています。これらのファイルの削除のスクリプトは
[data_file]picture:=[data_file]picture*0
でいいのでしょうか。
というのは,4Dからはどの画像データも見る事が出来るのに,外部の画像ファイルを開こうとした所,どんなアプリでも開けない.pngファイルがたくさん出て来ましたので,削除したつもりのファイルなのではと考えています。
4D Server ver15.2(Mac)で,多くの画像データを4Dデータファイルの外に保存しています。これらのファイルの削除のスクリプトは
[data_file]picture:=[data_file]picture*0
でいいのでしょうか。
というのは,4Dからはどの画像データも見る事が出来るのに,外部の画像ファイルを開こうとした所,どんなアプリでも開けない.pngファイルがたくさん出て来ましたので,削除したつもりのファイルなのではと考えています。
M_Fujihara- 投稿数 : 80
登録日 : 2016/12/03
Re: 正しい外部の画像ファイルの削除の仕方
こんにちは。
[data_file]picture:=[data_file]picture*0
これはピクチャのサイズをゼロにする,という命令文で,
(変数に対する)CLEAR VARIABLE ($image)
あるいは
C_PICTURE($blank)
[data_file]picture:=$blank
と同じ働きをします。
http://doc.4d.com/4Dv16/4D/16/Picture-Operators.300-3036459.ja.html
計測したことはありませんが,コンパイルできる演算子なので,おそらく,
picture*0がもっとも高速だと(ナノ秒レベルで・・・)思います。
ただし,サイズがゼロであっても,レコード自体は存在する以上,
ファイルを削除することにはなりません。
試しに,ピクチャフィールド1個のテーブルを作成し,
格納場所を「データファイルの外」に設定してみてください。
http://doc.4d.com/4Dv16/4D/16/External-data-storage.300-3048986.ja.html
バッファフラッシュのタイミングで,データベースフォルダー内に画像ファイルが作成されます。
{DB名}.ExternalData/Table {番号}/Field {番号}/Data_{UUID}.png
(PNGファイルをドラッグ&ドロップした場合)
{DB名}.ExternalData/Table {番号}/Field {番号}/Data_{UUID}.4PCT
(コピー&ペーストした場合)
4Dのピクチャは,複数の画像フォーマットを収めることができるコンテナです。
元の画像がファイルであれば,その画像フォーマットがそのまま格納されますが,
コピー&ペーストした場合,ペーストボード内の画像フォーマットすべてが含まれるため,
サイズが数百倍になることも珍しくありません。
それで,通常は,ファイルのドラッグ&ドロップで画像を受け入れるか,
ペースト操作の直後(On After Editイベント)でCONVERT PICTUREを実行します。
CONVERT PICTUREは,要求した画像フォーマット以外の形式を除去する効果があります。
元の画像に要求した形式が含まれなければ同時に変換も実行します。
元の画像に要求した形式が含まれなていれば,その形式がそのまま採用されます。
たとえば,透過属性が含まれる画像をPNG/BMPに変換する場合,
通常はアルファチャンネル(透明度)が失われますが,
元の画像がすでにPNG/BMPであれば,
そのまま透明度が残されます。
外部保存ファイルは,レコードを削除すると,自動的に削除されます。
ただし,「自動モード」の場合だけです。
「カスタムモード」の場合,トリガでGet external data pathをコールし,
自分で外部ファイルを削除しなければなりません。
http://doc.4d.com/4Dv16/4D/16/Get-external-data-path.301-3036707.ja.html
なお,「自動モード」では,外部ファイルもバックアップに含まれますが,
「カスタムモード」の場合,外部ファイルはバックアップに含まれませんので,
復元後,画像にアクセスできるようにするためには,パスが有効な環境を作る必要があります。
「カスタムモード」の場合,外部ファイルはOneDrive/iCloud/Dropboxなどで別途,バックアップできるでしょう。
ちなみに,v14までは,レコード保存時にSET EXTERNAL DATA PATHを実行すると,自動的にその場所にファイルが作成されましたが,v15以降,「ファイルの作成と変更は自分自身で管理する必要があります」(仕様の変更)。
http://doc.4d.com/4Dv16/4D/16/SET-EXTERNAL-DATA-PATH.301-3036703.ja.html
[data_file]picture:=[data_file]picture*0
これはピクチャのサイズをゼロにする,という命令文で,
(変数に対する)CLEAR VARIABLE ($image)
あるいは
C_PICTURE($blank)
[data_file]picture:=$blank
と同じ働きをします。
http://doc.4d.com/4Dv16/4D/16/Picture-Operators.300-3036459.ja.html
計測したことはありませんが,コンパイルできる演算子なので,おそらく,
picture*0がもっとも高速だと(ナノ秒レベルで・・・)思います。
ただし,サイズがゼロであっても,レコード自体は存在する以上,
ファイルを削除することにはなりません。
試しに,ピクチャフィールド1個のテーブルを作成し,
格納場所を「データファイルの外」に設定してみてください。
http://doc.4d.com/4Dv16/4D/16/External-data-storage.300-3048986.ja.html
バッファフラッシュのタイミングで,データベースフォルダー内に画像ファイルが作成されます。
{DB名}.ExternalData/Table {番号}/Field {番号}/Data_{UUID}.png
(PNGファイルをドラッグ&ドロップした場合)
{DB名}.ExternalData/Table {番号}/Field {番号}/Data_{UUID}.4PCT
(コピー&ペーストした場合)
4Dのピクチャは,複数の画像フォーマットを収めることができるコンテナです。
元の画像がファイルであれば,その画像フォーマットがそのまま格納されますが,
コピー&ペーストした場合,ペーストボード内の画像フォーマットすべてが含まれるため,
サイズが数百倍になることも珍しくありません。
それで,通常は,ファイルのドラッグ&ドロップで画像を受け入れるか,
ペースト操作の直後(On After Editイベント)でCONVERT PICTUREを実行します。
CONVERT PICTUREは,要求した画像フォーマット以外の形式を除去する効果があります。
元の画像に要求した形式が含まれなければ同時に変換も実行します。
元の画像に要求した形式が含まれなていれば,その形式がそのまま採用されます。
たとえば,透過属性が含まれる画像をPNG/BMPに変換する場合,
通常はアルファチャンネル(透明度)が失われますが,
元の画像がすでにPNG/BMPであれば,
そのまま透明度が残されます。
外部保存ファイルは,レコードを削除すると,自動的に削除されます。
ただし,「自動モード」の場合だけです。
「カスタムモード」の場合,トリガでGet external data pathをコールし,
自分で外部ファイルを削除しなければなりません。
http://doc.4d.com/4Dv16/4D/16/Get-external-data-path.301-3036707.ja.html
なお,「自動モード」では,外部ファイルもバックアップに含まれますが,
「カスタムモード」の場合,外部ファイルはバックアップに含まれませんので,
復元後,画像にアクセスできるようにするためには,パスが有効な環境を作る必要があります。
「カスタムモード」の場合,外部ファイルはOneDrive/iCloud/Dropboxなどで別途,バックアップできるでしょう。
ちなみに,v14までは,レコード保存時にSET EXTERNAL DATA PATHを実行すると,自動的にその場所にファイルが作成されましたが,v15以降,「ファイルの作成と変更は自分自身で管理する必要があります」(仕様の変更)。
http://doc.4d.com/4Dv16/4D/16/SET-EXTERNAL-DATA-PATH.301-3036703.ja.html
miyako- 投稿数 : 468
登録日 : 2016/07/05
Re: 正しい外部の画像ファイルの削除の仕方
ありがとうございました。
>ただし,サイズがゼロであっても,レコード自体は存在する以上,
>ファイルを削除することにはなりません。
開くことの出来ないファイルなので,本当にフィールドから削除した時に出来たファイルか否かを残念ながら確認出来ません。
しかし1枚当り300KB以上の4Dフォーマットのファイルを3000枚以上削除したにもかかわらず,ハードディスクの空き容量がほとんど変わらず,その後にTechTool Proでファイル構造の検査をかけて大量の読めないPNGファイルが見つかったので,この時のファイルではないかと思った次第です。ただ保存する画像フォーマットはJPEGだけですので,4Dの内部で作られたファイルだと思います。
>試しに,ピクチャフィールド1個のテーブルを作成し,
>格納場所を「データファイルの外」に設定してみてください。
削除をしてみました。ver13とver15で「データファイルの外」に画像ファイルが作られ,画像データと同じJPEGであるのを確認した後,[data_file]picture:=[data_file]picture*0で行うと画像ファイルが消えていました。ただPNGファイルは作られていません。
>ただし,サイズがゼロであっても,レコード自体は存在する以上,
>ファイルを削除することにはなりません。
開くことの出来ないファイルなので,本当にフィールドから削除した時に出来たファイルか否かを残念ながら確認出来ません。
しかし1枚当り300KB以上の4Dフォーマットのファイルを3000枚以上削除したにもかかわらず,ハードディスクの空き容量がほとんど変わらず,その後にTechTool Proでファイル構造の検査をかけて大量の読めないPNGファイルが見つかったので,この時のファイルではないかと思った次第です。ただ保存する画像フォーマットはJPEGだけですので,4Dの内部で作られたファイルだと思います。
>試しに,ピクチャフィールド1個のテーブルを作成し,
>格納場所を「データファイルの外」に設定してみてください。
削除をしてみました。ver13とver15で「データファイルの外」に画像ファイルが作られ,画像データと同じJPEGであるのを確認した後,[data_file]picture:=[data_file]picture*0で行うと画像ファイルが消えていました。ただPNGファイルは作られていません。
M_Fujihara- 投稿数 : 80
登録日 : 2016/12/03
Re: 正しい外部の画像ファイルの削除の仕方
画像をクリアするとファイルが削除されるのですね!
知りませんでした。
確かに理にかなっていると思います。
「開けないPNG」とのことですが,
画像ファイルは拡張子よりも最初の数バイトが形式を判別する手がかりになったりします。
バイナリエディター,あるいは4Dのコマンド(RECEIVE PACKET+BLOB, DOCUMENT TO BLOB等)で調べることができるかもしれません。
FF D8 FFで始まればJPEG
89 50 4E 47 0D 0A 1A 0Aで始まればPNG
http://www.garykessler.net/library/file_sigs.html
ファイルが作成されたのは,外部データファイルフォルダー内,
それともどこか別の場所(一時フォルダーなど)でしょうか。
ファイルの更新日は何かを示唆していないでしょうか。
知りませんでした。
確かに理にかなっていると思います。
「開けないPNG」とのことですが,
画像ファイルは拡張子よりも最初の数バイトが形式を判別する手がかりになったりします。
バイナリエディター,あるいは4Dのコマンド(RECEIVE PACKET+BLOB, DOCUMENT TO BLOB等)で調べることができるかもしれません。
FF D8 FFで始まればJPEG
89 50 4E 47 0D 0A 1A 0Aで始まればPNG
http://www.garykessler.net/library/file_sigs.html
ファイルが作成されたのは,外部データファイルフォルダー内,
それともどこか別の場所(一時フォルダーなど)でしょうか。
ファイルの更新日は何かを示唆していないでしょうか。
miyako- 投稿数 : 468
登録日 : 2016/07/05
Re: 正しい外部の画像ファイルの削除の仕方
RES,ありがとうございます。
開けないファイルのうちの1つを上げてみると,
Data_25A9C79754D84B22A676FE29EEE17D86.png
です。外部データファイルフォルダー内のかなり深い階層内にありました。
ファイルの作成日と更新日が同じ2014年で,4D Serverが稼動していた時間内です。
Graphic Converterではこうなります。

開けないファイルのうちの1つを上げてみると,
Data_25A9C79754D84B22A676FE29EEE17D86.png
です。外部データファイルフォルダー内のかなり深い階層内にありました。
ファイルの作成日と更新日が同じ2014年で,4D Serverが稼動していた時間内です。
Graphic Converterではこうなります。

M_Fujihara- 投稿数 : 80
登録日 : 2016/12/03
Re: 正しい外部の画像ファイルの削除の仕方
ファイルのはじまりが「TCP4」バイトスワップで「4PCT」なので,これは4Dの内部ピクチャ形式であることが推定できます。本来の拡張子は「.4pct」です。(READ PICTURE FILEなどで読み込むことができるはずです)PNGのシグネチャもみえますので,CONVERT PICTUREでPNGパートを取り出すこともできると思います。
miyako- 投稿数 : 468
登録日 : 2016/07/05
Re: 正しい外部の画像ファイルの削除の仕方
READ PICTURE FILEで読み込み,表示することが出来ました。ありがとうございました。これは現在使用中のファイルでした。
実験では,外部に作られるファイルは,.jpegなら.jpegと読み込んだファイルと同じ拡張子ですが,稼動している4Dでは.jpegの他に,.4pctや.pngのファイルも作られています。4Dは内部では4pctで保存しているのは分かるのですが,ファイルとして外に作られたのはどうしてでしょうか。
実験では,外部に作られるファイルは,.jpegなら.jpegと読み込んだファイルと同じ拡張子ですが,稼動している4Dでは.jpegの他に,.4pctや.pngのファイルも作られています。4Dは内部では4pctで保存しているのは分かるのですが,ファイルとして外に作られたのはどうしてでしょうか。
M_Fujihara- 投稿数 : 80
登録日 : 2016/12/03
Re: 正しい外部の画像ファイルの削除の仕方
外部フォルダはどのような規則で作られるのでしょうか。うちのでは
(フォルダ)Table 2 > (フォルダ)Field 3 > (フォルダ)5 > (フォルダ)1 > Data_25A9C79754D84B22A676FE29EEE17D86.png
などとなっています。Table, Fieldまでは名前の通りですが,数字だけのフォルダには,それぞれ複数の階層があり,時期の違う同じFieldのファイルや.4pctファイルが入っています。
(フォルダ)Table 2 > (フォルダ)Field 3 > (フォルダ)5 > (フォルダ)1 > Data_25A9C79754D84B22A676FE29EEE17D86.png
などとなっています。Table, Fieldまでは名前の通りですが,数字だけのフォルダには,それぞれ複数の階層があり,時期の違う同じFieldのファイルや.4pctファイルが入っています。
M_Fujihara- 投稿数 : 80
登録日 : 2016/12/03
Re: 正しい外部の画像ファイルの削除の仕方
フォルダーは定員(?)が100名で,101個目のファイルから新しいフォルダーが作られるようになっています。
画像ファイルを直接ドラッグ&ドロップした場合,あるいはREAD PICTURE FILE等で読み込んだ場合はオリジナルの画像ファイルのコピー,コピー&ペーストした場合は4PCT(複合形式)になるはずです。
初期のv11/12では,サーバーとクライアントのプラットフォーム(Mac or Windows)が違う場合,常に4PCTになったと記憶していますが,それは是正されているはずです。
$path:=System folder(Desktop)+"sample.png"
$size:=Get document size($path)
READ PICTURE FILE($path;$image)
みたいなコードで確認できるかと思いますが,ファイル由来の画像は,内部的にもオリジナルの形式で管理されています。4PCTが書き出されたのは,その画像がファイル由来ではない(たとえばペーストした画像)あるいは何らかのピクチャ操作がされたことを示唆しています。
外部ファイルに4PCTが書き出されることを回避するためには,オリジナルの形式,あるいは単一の形式にピクチャを変換する必要があると思います。
たとえば,トリガでCONVERT PICTUREが実行できるかもしれません。
ちなみに,下記のプラグインは,4PCTに含まれる画像の配列を取り出すことができます。
https://github.com/miyako/4d-plugin-split-pictures
画像ファイルを直接ドラッグ&ドロップした場合,あるいはREAD PICTURE FILE等で読み込んだ場合はオリジナルの画像ファイルのコピー,コピー&ペーストした場合は4PCT(複合形式)になるはずです。
初期のv11/12では,サーバーとクライアントのプラットフォーム(Mac or Windows)が違う場合,常に4PCTになったと記憶していますが,それは是正されているはずです。
$path:=System folder(Desktop)+"sample.png"
$size:=Get document size($path)
READ PICTURE FILE($path;$image)
みたいなコードで確認できるかと思いますが,ファイル由来の画像は,内部的にもオリジナルの形式で管理されています。4PCTが書き出されたのは,その画像がファイル由来ではない(たとえばペーストした画像)あるいは何らかのピクチャ操作がされたことを示唆しています。
外部ファイルに4PCTが書き出されることを回避するためには,オリジナルの形式,あるいは単一の形式にピクチャを変換する必要があると思います。
たとえば,トリガでCONVERT PICTUREが実行できるかもしれません。
ちなみに,下記のプラグインは,4PCTに含まれる画像の配列を取り出すことができます。
https://github.com/miyako/4d-plugin-split-pictures
miyako- 投稿数 : 468
登録日 : 2016/07/05
Re: 正しい外部の画像ファイルの削除の仕方
ありがとうございました。
>フォルダーは定員(?)が100名で,101個目のファイルから新しいフォルダーが作られる
>ようになっています。
納得です。TechTool Proなどで異常を指摘されても,あまり外部フォルダを直接操作しない方が良さそうですね。
これからもよろしくお願いいたします。
>フォルダーは定員(?)が100名で,101個目のファイルから新しいフォルダーが作られる
>ようになっています。
納得です。TechTool Proなどで異常を指摘されても,あまり外部フォルダを直接操作しない方が良さそうですね。
これからもよろしくお願いいたします。
M_Fujihara- 投稿数 : 80
登録日 : 2016/12/03
Permissions in this forum:
返信投稿: 不可
|
|