2017-03-11 3 views
1

私はElectronでプレゼンテーションスタイルのアプリケーション(Powerpoint、Keynoteなど)を開発しています。このアプリケーションでは、画像ファイルをプロジェクトフォルダに読み込むことができ、潜在的なファイル名の競合の問題を処理する方法が不思議です。ユーザーのインポート時に重複するファイル名を処理するスキーマ

私は車輪を再発明したくありません。この種のスキーマ、デザインパターン、フレームワークはありますか?たとえば、OSXの場合、iPhotoは日付、インポート時間、一見ランダム(?)IDを使用して、インポートされた画像を整理します。

私はこれをJavascriptとして実装しますが、主に問題にアプローチして言語が問題にならないようにする方法に興味があります。


のiPhotoライブラリ:

ユニークなフォルダ名

フォルダ内の各ファイルを配置することにより:

enter image description here

+0

は、フォルダ名としてGUIDを使用してください。 – dbugger

答えて

0

私が知っ2つの方法があります。ユニークな名前で、オリジナルを保存することができますファイル名を変更してクラッシュを避けてください。関連するファイル(画像サムネイルなど)を元のファイルに保存する場合は、この方法を使用すると作業がはるかに簡単になります。

UUIDを使用して一意のフォルダ名を生成できます.UUIDは、実質的には衝突しないことが保証されている文字列です。 uuidのように、UUIDを生成するためのNode.jsライブラリがたくさんあります。またはランダムな文字列を使用して、フォルダがすでに存在するかどうかを確認してください。

また、指定した例のように、フォルダ名は日付と時刻によって生成されますが、1つの時点で1つの項目を追加するだけでなく、 iPhotoの例のように日付を入力します。 iPhotoの日付付きフォルダは、フォルダ名としてもランダムな文字列を使用している場合はおそらく必要ありませんが、フォルダを手動で参照しているユーザーにとっては使いやすく、iPhotoにディレクトリリストが必要な場合はパフォーマンス上の利点があります特定の日付

ファイルを読み込むためにフォルダ名とファイル名の両方への参照を格納する必要がありますが、もちろんこれは1つの文字列にすることができます。 "6c84fb90-12c4-11e1-840d-7b25c5ee775a/image.jpg"

ユニークなファイル名

別の技術は、衝突があるたびに一意の名前を持つようにファイル名を変更することです。これは、新しいフォルダを作成したり、ファイルを複製したりするときにmacOS Finderが使用するアプローチです。この方法は通常、ユーザーが無意味な名前のフォルダをナビゲートする必要がないため、ファイルと直接対話できる場合に最適です。

単純な例として、ペンギンの写真を追加していて、すでにpenguin.jpgという写真が追加されているとします。

今私はpenguin.jpgと呼ばれることもある2番目の写真を追加します。

  1. penguin.jpgが存在するかどうかを確認します。そう、そう...
  2. ファイルの新しい名前を生成します。penguin-2.jpg
  3. penguin-2.jpgが存在するかどうかを確認します。それは(私もpenguin.jpgと呼ばれる複数のファイルを追加する場合、プログラムは、私は存在しないものを見つけるまで、名前をインクリメントしておく必要がpenguin-2.jpg

として新しいファイルをしないので、...

  • 保存例えばpenguin-3.jpg)。同じ名前のファイルを何千も追加しない限り、パフォーマンスの問題は発生しません(これはおそらくないようです)。

    私はあなたのために、このアプローチを扱うことができるNode.jsのモジュールを見つけました:uniquefilename

  • +0

    お世話になりました。私が「uuid」全体について懸念しているのは、Windowsのパスの260文字制限にクラッシュしています(http://stackoverflow.com/questions/1880321/why-does-the-260-character-path-length-私のアプリはx-platformなので)いくつかの入れ子になったディレクトリ、uuidと絶対パスは260以上になる可能性があります。 –

    +0

    もっと短いランダムな文字列を使うことができます。 'Math.random()。toString(36).substring(7)'で、衝突の際に同じ名前の既存のフォルダをチェックするだけです(これはまれではありますが、 –

    関連する問題