質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.40%

  • C#

    9400questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Windows 10

    1318questions

    Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

ファイル削除の効率的な方法

解決済

回答 3

投稿

  • 評価 0
  • クリップ 2
  • VIEW 189

f_tonakai

score 2

システムで出力しているログを定期的に削除したいんですが、
効率的な削除方法が無いか悩んでいます。

[仕様]
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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • user1

    2019/07/10 23:23

    ファイルのパスを保持するだけでメモリを圧迫する可能性があるほど大量ということでしょうか?

    キャンセル

  • k.matsuda

    2019/07/11 17:35

    参考までに
    ファイル名にある日付の数字から抽出するのではなく、ファイルの作成日時や更新日時を取得することも出来ます。

    キャンセル

回答 3

checkベストアンサー

+6

100 ほどのファイル名でメモリが圧迫されるようなシステムであれば、ハードの増強が必須でしょう。この程度のメモリの使用は問題にならないと思います。
しかし、もっと大規模な使用を視野に入れて、無駄なメモリを確保したくないというのであれば、GetFiles の代わりに EnumerateFiles を使ってください。こちらは配列を返すのではなく、列挙子を返します。

例えば次のような使い方をすることによって、foreach ループが一回回るたびに該当ファイルが一つ列挙されます。
これを遅延評価といいます。

[雑記] LINQ と遅延評価

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);
            }
        }
    }
}

投稿

Zuishin

Zuishin

C#総合1位

score 18356

  • C#総合1位
  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • haruniku

    haruniku

    2019/07/11 20:46

    低評価とさせて頂きます。理由はわかりますよね?

    キャンセル

  • Zuishin

    Zuishin

    2019/07/11 20:47

    わかりませんね。説明してください。

    キャンセル

  • Zuishin

    Zuishin

    2019/07/11 20:48

    通報しておきましたので、運営が見る前に正当な理由を考えておいてください。

    キャンセル

  • haruniku

    haruniku

    2019/07/11 20:48

    自分の心の中で考えて見てください^ ^

    キャンセル

  • Zuishin

    Zuishin

    2019/07/11 20:49

    わからないので説明してください。あなたが私よりもこの言語について詳しいのですか?

    キャンセル

  • Zuishin

    Zuishin

    2019/07/11 20:52

    まず、このコードが何をしているのか説明できますか?

    キャンセル

  • Zuishin

    Zuishin

    2019/07/11 21:00

    どうしました権左衛門さん?
    一行もわからないのに低評価したのですか?
    失笑

    キャンセル

  • f_tonakai

    f_tonakai

    2019/07/11 21:38

    Zuishinさん
    コードまで載せて頂きありがとうございます。
    試してみたいと思います
    ありがとうございます

    キャンセル

  • pepperleaf

    pepperleaf

    2019/07/11 22:30

    この方法、確かに効率的、とも思ったのですが、遅延評価で、ファイル名取得中に、ファイル削除ってどうなのでしょうか?
    .Netの内部処理分かりませんが、Unixみたいに、ディレクトリファイルの場合、ファイル名取得中にファイル名を保持しているファイル(ディレクトリファイル)を更新する事になる気がします。

    キャンセル

  • Zuishin

    Zuishin

    2019/07/11 22:55

    私が試した時にはうまく動きました。確認お願いできますか?

    キャンセル

+1

非力なPCなら、ともかく、Windows10がストレスなく使える PCならば、100ファイル程度のリストの取得は全く問題無いと思います。

今、ログファイルが 100を越えたところで、削除していますが、特に問題はありません。 ただ、テストが面倒なだけ。

投稿

pepperleaf

pepperleaf

score 3458

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • f_tonakai

    f_tonakai

    2019/07/11 00:11 編集

    スペック的な問題はありません
    削除するときには、消せないログファイルが
    常に3ヶ月分(90~100程度)あるので、
    単純にそれ以上のファイルリストを
    作ることになります。
    実装として問題ないのか気になって質問させて頂きました

    キャンセル

0

バッチなりシェルなりで消すとか

投稿

YAmaGNZ

YAmaGNZ

VB.NET総合1位

score 4531

  • VB.NET総合1位
  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • f_tonakai

    f_tonakai

    2019/07/11 00:14

    bat,vbscript,shellscriptではなく
    c#で実装になったので、選択肢がありません
    shellscriptが楽だと思ってたのですが

    キャンセル

  • YAmaGNZ

    YAmaGNZ

    2019/07/11 00:20 編集

    C#から、バッチファイルなりを作成し、それを実行後消すとかでもダメなんですか?
    まぁ、アプリ起動時だけであれば、列挙して消しても問題ないと思いますけどね。
    日付がファイル名にあるので、そのフォルダ全てのファイルを列挙する必要もないでしょうし

    キャンセル

  • f_tonakai

    f_tonakai

    2019/07/11 07:13

    日付がファイル名にあるので、そのフォルダ全てのファイルを列挙する必要もないでしょうし

    とは
    どういうことですか?

    キャンセル

  • YAmaGNZ

    YAmaGNZ

    2019/07/11 07:35

    どのようなスパンでアプリを起動するのか分かりませんが、仮に1日1回は起動するというのであれば、2019/07に起動の場合、2019/03が削除対象になるのですから、*201903*.logと列挙するなりフィルタはできるのではないかと思います。
    ただ、正解はZuishinさんの回答だと思いますね

    キャンセル

  • f_tonakai

    f_tonakai

    2019/07/11 21:37

    >*201903*.logと列挙するなりフィルタはできるのではないかと思います。
    なるほどです。
    ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.40%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C#

    9400questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Windows 10

    1318questions

    Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。