0

在庫管理アプリケーションを開発しています。私が作成できるすべての種類のアイテムは、いくつかのフィールド (作成日、説明など) を持つ一般的な基本クラスを継承します。これらすべてのアイテムには、ドキュメント ファイル (pdf、テキスト ファイル、写真、関係ありません) を含めることができます。これらのファイルは、公開されているネットワーク共有に保存されます。ユーザーにファイルの選択、アップロード、開き、関連情報をデータベースに保存するように求めることができる基本的な機能プロトタイプが既にあります。基本的な例を次に示します。

//choosing and copying the file
string filename;
string destination;
Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();                       
Nullable<bool> result = dlg.ShowDialog();
if (result == true)
{
  filename = dlg.FileName;
  destination = @"\\theshare\Data\Doc\";
  textBox1.Text = filename;//just for test/display purpose
  File.Copy(filename, destination + dlg.SafeFileName);
  SaveInfoInDatabase(dlg);//description, path
}

//open the file with default application, called by a button press
System.Diagnostics.Process.Start(destination + dlg.SafeFileName);

先に進む前に、私は次のことを自問しました。

  1. このコードを非同期で実行する必要がありますか? 最大のファイルは最大 50 MB です
  2. 元の名前の代わりにファイル名に GUID を使用するか、同じファイル名の場合は最後に数字を追加する必要がありますか?
  3. 重複はどのように処理すればよいですか?
    (たとえば、20 個の異なるアイテムがすべて同じPDF ドキュメントを共有しているとします)
  4. 絶対パスまたはファイル名のみを保存し、ディレクトリに const 文字列を使用する必要がありますか?
  5. ファイルを変更できる場合、ローカル コピーを作成するか、ファイルを開いてコピーし直すか、元のファイルを開く必要がありますか? 並行性は大きな問題ではなく、ほとんどが参考資料です。
  6. 私は間違った道を進んでいますか?この種のタスクにはおそらく設計パターン/ガイドラインがありますが、重要なものは見つかりませんでした。
  7. 別の方法でファイルを開く必要がありますか? たぶんユーザーに尋ねますか?
4

2 に答える 2

1

私は過去にシステムを構築しなければなりませんでした。これらの質問に私がどのように取り組んだかを次に示します。

  1. はい。UI スレッドをブロックしないでください。
  2. GUID /ファイル名に使用するデータベースキーを使用します。
  3. しないでください。私のアプリケーションでは、各ファイルは複数のリビジョンを通過する可能性があり、バージョン 1.0 で 1 つのファイルが重複しているからといって、それらが将来分岐しないとは限りません。
  4. 特に絶対パスではなく、ファイル名をデータベースに直接保存しないでください。高レベルのコードを使用して、DB GUID / ID <=> ファイル名から変換します。
  5. はい。ソース ファイルを直接変更しないでください。2 人が同じファイルを編集するのを防ぐために、チェックイン/チェックアウト システムを含めることもできます。
  6. これらのタイプのプロジェクトは、最初から範囲を制限しないと、すぐに手に負えなくなる可能性があります (実際、どのソフトウェア製品でも可能です)。続行する前に、これが本当に必要なものであることを確認することをお勧めします。
  7. いいえ。クライアント システムで既定のアプリケーションを使用するのは、これまでに見た他のどのアプリケーションよりもはるかに簡単です。
于 2013-03-05T20:12:43.560 に答える
0

多くの質問は実際にはコードに関連するものではありませんが、私はあなたが以前に経験したような問題を経験したので、突き刺します

  1. 私は、間違いなくそうです。この目的のためにTaskクラスを使用しましたが、.Net 4.5 を使用している場合はawaitを使用できます。
  2. 以前の仕事で同じ問題に遭遇しました。ファイル名はかなり (十分に) 一意であるため、GUIDS を使用しました。
  3. これについて明確にする必要があります。一部のアイテムが同じドキュメントを使用している場合は、PDFへの参照を保存できます(存在するかどうかを確認した後)
  4. 必要なものだけを保管します。ファイルの場所が同じ場所にあり、決して変更されない場合(THINGS ALWAYS CHANGE)、ファイル名のみを保存しても問題はありません。ただし、状況は変化します。そのことに注意してください。そのため、ファイルの場所を構成可能にするようにしてください (app.config、web.config など)。
  5. ビジネス クリティカルなファイルを転送していました。File.Copy を使用して、転送元から転送先に直接転送しました。タスクを完了としてマークする前に、ファイルが宛先に存在することを確認する追加のチェックがありました。ほとんどの場合は問題ないように見えましたが、何らかの理由で失敗した場合は、コピーできるまで再試行します。したがって、同じことを行うようにアプリケーションを適応させることができます。つまり、ファイルを試してコピーし、ファイルが存在することを確認し、成功を返します。
  6. 私はそれがファイルであるため、ファイルに関する間抜け(ロック、例外など)を常に処理する必要があると思います。これを管理する最善の方法は、優れたフレームワークです。小さなものから始めて、2 つのフォルダーを用意し、各ファイルをループして別のディレクトリにコピーするコンソール アプリを作成し、それから上に向かって進みます。ファイルを管理するためのハードで迅速なガイドやデザイン パターンは見たことがありませんが、かなり堅牢で再利用可能なフレームワークを作成することはできます。
  7. ユーザーはファイルをアップロードしてあなたに尋ねていませんか?
于 2013-03-05T20:09:56.043 に答える