ファイル削除の効率的な方法
解決済
回答 3
投稿
- 評価 0
- クリップ 2
- VIEW 189
システムで出力しているログを定期的に削除したいんですが、
効率的な削除方法が無いか悩んでいます。
[仕様]
1.システム起動時に、3ヶ月以上前のログファイルを削除する(3ヶ月分は消さずに置いておく)
2.ログファイル名は「aa_xxxxx_yyyymm.log (例:aa_sample_20190701.log)」
(xxxxxは5文字以上の場合あり、yyyymmはシステム起動時の日付)
[今考えている実装]
string[] files = System.IO.Directory.GetFiles(
@"E:\work\Log", "*", System.IOSearchOption.AllDirectories);
for(int i=0; i<files.length; i++) {
System.IO.File.Delete(files[i]);
}
:
(後続の処理)
:
この場合、
1日1ログファイル生成されるとして、最低90ファイル数(1ヶ月30日として)以上あるので、
メモリで一括保持するのはどうかなと思っています。
他にいい方法はありませんか?
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
- メールアドレスの認証
メールアドレスの認証
- 質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+6
100 ほどのファイル名でメモリが圧迫されるようなシステムであれば、ハードの増強が必須でしょう。この程度のメモリの使用は問題にならないと思います。
しかし、もっと大規模な使用を視野に入れて、無駄なメモリを確保したくないというのであれば、GetFiles の代わりに EnumerateFiles を使ってください。こちらは配列を返すのではなく、列挙子を返します。
例えば次のような使い方をすることによって、foreach ループが一回回るたびに該当ファイルが一つ列挙されます。
これを遅延評価といいます。
using System;
using System.Linq;
using System.Text.RegularExpressions;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
var regex = new Regex(@"_(\d{4})(\d{2})(\d{2})\.log$");
var threshould = DateTime.Today.AddDays(-90);
bool ShouldDelete(string path)
{
var match = regex.Match(path);
if (!match.Success) return false;
var dateOfLogFile = new DateTime(
int.Parse(match.Groups[1].Value),
int.Parse(match.Groups[2].Value),
int.Parse(match.Groups[3].Value));
return dateOfLogFile < threshould;
}
var files = System.IO.Directory
.EnumerateFiles("path", "*", System.IO.SearchOption.AllDirectories)
.Where(ShouldDelete);
foreach (var file in files)
{
System.IO.File.Delete(file);
}
}
}
}
投稿
- C#総合1位
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
非力なPCなら、ともかく、Windows10がストレスなく使える PCならば、100ファイル程度のリストの取得は全く問題無いと思います。
今、ログファイルが 100を越えたところで、削除していますが、特に問題はありません。 ただ、テストが面倒なだけ。
投稿
score 3458
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
バッチなりシェルなりで消すとか
投稿
- VB.NET総合1位
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 90.40%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
user1
2019/07/10 23:23
ファイルのパスを保持するだけでメモリを圧迫する可能性があるほど大量ということでしょうか?
k.matsuda
2019/07/11 17:35
参考までに
ファイル名にある日付の数字から抽出するのではなく、ファイルの作成日時や更新日時を取得することも出来ます。