C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: 古い日付名ファイルの削除方法


(過去ログ 93 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■55746 / inTopicNo.1)  古い日付名ファイルの削除方法
  
□投稿者/ asuka (24回)-(2010/12/13(Mon) 11:56:58)

分類:[C#] 

お世話になっております。

古い日付名ファイルの削除ロジックについてお知恵を貸して頂ければ幸いです。

指定ディレクトリにあるデータをバックアップしております。
例:
20101201_1.mdb
20101201_2.mdb
20101202_1.mdb
20101202_2.mdb
20101203_3.mdb
20101204_1.mdb
20101205_1.mdb


ファイル名は[YYYYMMDD_x.mdb]形式で、MDBファイルに約2Gの制限があることから2Gを超える場合は、

分割ファイルとしてxの箇所が1からはじまりインクリメントしていく形です。

バックアップファイルの保持日数を設定で指定出来るようにしております。

例えば保持数を2日とした場合は、最新の日付から2日分を保持しますので、例の場合ですと、
20101204_1.mdb
20101205_1.mdb
が残り、その他は全て削除される仕様です。



この仕様を実現するにあたり、良い方法はありませんでしょうか?

現状僕の乏しい知識で考えているロジックは、
1.バックアップ先指定ディレクトリをワイルドカードを使用してファイル一覧取得
Directory.GetFiles(strSaveDir, "????????_*.mdb", SearchOption.TopDirectoryOnly);
2.取得したファイル名一覧をループで回して先頭8文字(YYYYMMDD)部分を取得
3.先頭8文字(YYYYMMDD)部分ユリウス値(LONG)に変換
 →日付の大小比較方法が分からないため年月日をLONGに直して比較しようとしています。
  良い方法があればご教授願います。
4.先頭8文字(YYYYMMDD)部分ユリウス値(LONG)に変換した値をArrayListへ格納してソート(降順)
5.バックアップファイルの保持日数になるまでfor分をデクリメントしながらArrayListの中身を削除
 →削除する対象は残すファイル
  ArrayListに残ったファイルを削除するため
6.残ったArrayList内のユリウス値(LONG)を年月日に戻す
7.6で戻したファイル一覧を削除


まだ実装しておりませんが、どう考えても効率が悪そうなのでもっと良い方法があればご教授願いたい次第です。

よろしくお願い致します。


---
VS2010
.Net2.0
Win32アプリC#での実装
引用返信 編集キー/
■55747 / inTopicNo.2)  Re[1]: 古い日付名ファイルの削除方法
□投稿者/ shu (278回)-(2010/12/13(Mon) 12:16:58)
No55746 (asuka さん) に返信

日付条件で削除するならわざわざソートをする必要がない。
各ファイルに対するループで日付条件で削除実行すれば良いのでは?

提示された方法で行うとしてもArrayListではなくList<string>を使用した方が
よいかと思います。ArrayListはobject型が対象なので極力さけた方がいいかと
思います。今回は違いますが特に値型を扱う場合など。

日付の部分を数値に直して扱うのは特に問題ないかと思います。

DirectoryInfo.GetFilesを使用すればFileInfoが取得出来るので、作成日時、最終更新日時が
分かるのでそれを参照するという方法もあります。MDBの場合、最終更新日時は開く毎に変わってしまいますが。
引用返信 編集キー/
■55752 / inTopicNo.3)  Re[1]: 古い日付名ファイルの削除方法
□投稿者/ やじゅ (1789回)-(2010/12/13(Mon) 12:54:53)
やじゅ さんの Web サイト
No55746 (asuka さん) に返信

日付を0埋めにしているなら、数値に直さなくても文字列型で大小比較はできます。

2010/12/2と2010/12/10を文字列型で比較した場合の関係性
2010122 > 20101210 12/2の方が大きい
20101202 < 20101210 12/2の方が小さい

引用返信 編集キー/
■55757 / inTopicNo.4)  Re[2]: 古い日付名ファイルの削除方法
□投稿者/ PATIO (74回)-(2010/12/13(Mon) 15:57:20)
2010/12/13(Mon) 15:58:23 編集(投稿者)

月と日を0詰めで表現しているなら文字列の状態でも
大小関係は取れるという部分に関しては、やじゅさんが書かれている通りですね。

但し、この状態だと最新のデータからn日分のデータを残すという計算は
面倒になりそうですけれど。
仮にバックアップを取る時に古いファイルの削除を考えているのであれば、
バックアップ処理をした日付は持っていても良いと思うので、
そこからいつの分から残すのかを計算してYYYYMMDD形式に変換し、
文字列ベースで比較と言う手もありますね。

細かい話をするなら、文字列での比較は数値での比較よりも時間が掛かります。
ですが、数値で比較するのであれば文字列から数値に変換する時間が掛かります。
結局、トータルでの時間として見た時にどちらが短いの?と言う話なります。
最近の一般的なPC上で処理をするのであれば、問題になるほど時間差が出るとは
思えないので、解りやすさを優先しても良さそうな気はします。

引用返信 編集キー/
■55763 / inTopicNo.5)  Re[3]: 古い日付名ファイルの削除方法
□投稿者/ asuka (25回)-(2010/12/13(Mon) 17:57:04)
レス頂きありがとうございます。
m(__)m

>shuさま
>提示された方法で行うとしてもArrayListではなくList<string>を使用した方が
>よいかと思います。
こちらはそのようにさせて頂きました。
ご指摘ありがとうございます。

>DirectoryInfo.GetFilesを使用すればFileInfoが取得出来るので、作成日時、最終更新日時が
分かるのでそれを参照するという方法もあります。MDBの場合、最終更新日時は開く毎に変わってしまいますが。

まさしくMDBの場合開くと最終更新日が変わってしまいますので、この度はファイル名のみを比較の対象とすることにしました。



>やじゅさま PATIOさま
なるほど、0埋めしていると日付の文字列比較は上手くいくんですね。
(キャラクターコードで比較してるため???)

知らない知識でしたのでためになりました。

ありがとうございます。



結局自分で提示させて頂いた通りユリウス値に変換したり戻したりして実装しました。

振り返ってみますとPATIOさんが記載してくれましたが、文字列比較でやればよかったと思いました。

変換用の関数を書いたり、ソースコードが長くなっただけで、試したところ人間の間隔で8文字の文字列比較が遅いとは感じませんでしたので。。。
(僕が人間だといいのですが…)

色々と教えて頂きありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -