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

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

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

最新のサブフォルダに保存したい

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

■95889 / inTopicNo.1)  最新のサブフォルダに保存したい
  
□投稿者/ 銀だこは邪道 (1回)-(2020/10/07(Wed) 16:03:48)

分類:[C#] 

フォームアプリケーションでデータを保存するソフトを作成しています。
ボタンを押すと日付事にサブフォルダを作り、最新の日付のサブフォルダにファイルを保存しようとしています。
最新のフォルダを見つけてそれをパスに入れる方法が下記しか思いつきません。

結果として動作はしているのですがこんなコードの書き方じゃなくて
他に便利なメソッドがあったり、「その場合はこう記述するんだよ」ってのがあったら教えて貰いたいです。
GetCreationTimeを使ってもみたのですがパスに入れるのに時間が邪魔で諦めました。
フォルダ名は"yyyyMMdd"

string path = @"パス";
string[] subFolders = Directory.GetDirectories(path, "*", SearchOption.AllDirectories);
string max = subFolders.Max();
StreamWriter writer = new StreamWriter(max + "\\" + textBox1.Text + ".csv", true);

引用返信 編集キー/
■95890 / inTopicNo.2)  Re[1]: 最新のサブフォルダに保存したい
□投稿者/ とっちゃん (693回)-(2020/10/07(Wed) 17:32:47)
No95889 (銀だこは邪道 さん) に返信
> フォームアプリケーションでデータを保存するソフトを作成しています。
> ボタンを押すと日付事にサブフォルダを作り、最新の日付のサブフォルダにファイルを保存しようとしています。
> 最新のフォルダを見つけてそれをパスに入れる方法が下記しか思いつきません。
> 

ボタンを押すと、フォルダを作成し、そのフォルダにファイルを保存するという形ですか?

であれば、以下のようにすればよいかと。

string path = Path.Combine( どこかのベースディレクトリ, DateTime.Today.ToString( "yyyyMMdd" ) );
Directory.CreateDirectory( path ); // すでに存在するフォルダで作成に行ってもエラーにはならない
using( var writer = new StreamWriter( Path.Combine( path, textbox2.Text + ".csv" ), true ) )
{
  書き出し処理();
}

という感じでよいのではないでしょうか?
フォルダを作成するということはその時点で新しいフォルダ名を持っているはずなのでそれをとっておけばいいだけだと思います。

引用返信 編集キー/
■95894 / inTopicNo.3)  Re[2]: 最新のサブフォルダに保存したい
□投稿者/ 銀だこは邪道 (2回)-(2020/10/07(Wed) 20:52:15)
フォルダを作るのではなく、最新のサブフォルダを判断し、
パスが毎日変わってしまうのでその保存先のパス指定方法を知りたいのです。
引用返信 編集キー/
■95896 / inTopicNo.4)  Re[3]: 最新のサブフォルダに保存したい
□投稿者/ とっちゃん (694回)-(2020/10/07(Wed) 21:43:43)
No95894 (銀だこは邪道 さん) に返信
> フォルダを作るのではなく、最新のサブフォルダを判断し、
> パスが毎日変わってしまうのでその保存先のパス指定方法を知りたいのです。

「ボタンを押すと日付事にサブフォルダを作り」とあったのでてっきりボタンを押した日付のフォルダだと思ったのですが違うのでしょうか?

string todayString = DateTime.Today.ToString( "yyyyMMdd" ) で今の日付を文字列にしてくれます。

たぶん、サブフォルダを作るところでこのような処理があると思います。

もしそうではなくいっぺんに作っているのなら、なおさら今日を選んで保存できないとだめだと思うのですが?
(そうじゃなければ日付フォルダを作ってる意味がないような。。。)

それと、文字列比較でMaxなので、@"パス" が指すフォルダに日付以外のフォルダがあった場合、意図しないフォルダに保存してしまうことになりますが
そのあたりは問題はないのでしょうか?

一応。。。「最新の作成時刻」のフォルダに保存とするならのパターンも組み立ててみました。
なるべく同じような形にしてあります。

var path = new DirectoryInfo( @"パス" );
var subFolders = path.EnumerateDirectories( "*", SearchOption.AllDirectories );
string max = subFolders.OrderBy( dirInfo => dirInfo.CreationTimeUtc ).Last().FullName;

max の型は最初に提示したものと同じなのであとの処理(StreamWriter の作成部分)は一緒です。

おまけですが、パス名組み立ては、Path.Combine() の利用をお勧めします。

引用返信 編集キー/
■95900 / inTopicNo.5)  Re[4]: 最新のサブフォルダに保存したい
□投稿者/ 銀だこは邪道 (3回)-(2020/10/08(Thu) 09:19:11)
説明べたで申し訳ないです。コードも一部しか乗せていなかったのも問題でした。
フォルダの作成は初めのコードの上に書いてあり、ファイルの保存方法だけ知りたかったので乗せませんでした。
実際のコードを載せます。質問時に書いたコードは忘れてください。

説明が下手なので改めてして欲しい動作を書きます。
ボタンを押す⇒その日のフォルダが出来る⇒その中にファイルを保存する
ファルダは一日1個。ファイルは複数保存します。

下のコードでも動作はしますがコードのセンスがないのでもっとシンプルにしたコードを教えてください。

public void SaveFile()
{
string folderName = DateTime.Today.ToString("yyyyMMdd", CultureInfo.CurrentCulture);
string path = Path.Combine(@"パス", folderName);
if(!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}

string filePath = @"pathと同じパス";
string[] subFolders = Directory.GetDirectories(filePath, "*", SearchOption.AllDirectories);
string max = subFolders.Max();
StreamWriter writer = new StreamWriter(max + "\\" + txtLotNo.Text + ".csv");
DateTime timeNow = DateTime.Now;
writer.WriteLine(書き込む中身);
writer.Close();
}

当初Directory.GetDirectoriesの第一引数にPath.Combineで作ったpath変数を使ってもみましたが
CSVファイルが作れず、わざわざfilePath変数を作り結果上のようなコードになってしまいました。
引用返信 編集キー/
■95908 / inTopicNo.6)  Re[5]: 最新のサブフォルダに保存したい
□投稿者/ とっちゃん (695回)-(2020/10/08(Thu) 10:55:25)
No95900 (銀だこは邪道 さん) に返信
> 説明べたで申し訳ないです。コードも一部しか乗せていなかったのも問題でした。
> フォルダの作成は初めのコードの上に書いてあり、ファイルの保存方法だけ知りたかったので乗せませんでした。
> 実際のコードを載せます。質問時に書いたコードは忘れてください。
>
> 説明が下手なので改めてして欲しい動作を書きます。
> ボタンを押す⇒その日のフォルダが出来る⇒その中にファイルを保存する
> ファルダは一日1個。ファイルは複数保存します。
>
ボタンを押すと、SaveFile()を呼び出すということでいいでしょうか?


> 下のコードでも動作はしますがコードのセンスがないのでもっとシンプルにしたコードを教えてください。
>

> public void SaveFile()
> {
> string folderName = DateTime.Today.ToString("yyyyMMdd", CultureInfo.CurrentCulture);
> string path = Path.Combine(@"パス", folderName);

// ディレクトリ作成部分は本題ではないのでカット

> string filePath = @"pathと同じパス";
> string[] subFolders = Directory.GetDirectories(filePath, "*", SearchOption.AllDirectories);
> string max = subFolders.Max();

// 以後のファイル作成部分も本題ではないのでカット

と、実コードの問題と思われているであろう箇所を抜粋してみました。

求めたい max は、path と同じパスですか?それとも、path のサブディレクトリですか?

より具体的には、
filePath の内容は、
filePath = path;
なのかそれとも
filePath = @"パス";
なのかで、状況が変わります。

filePath == @"パス";
であれば、求める max は、path と同じになります。

テストコードを用意してどういう値になっているかを確認してみるとよいと思います。
テストコードはコンソールアプリを作成し main の中身を以下のコードにします。
(@"パス" とか @"pathと同じパス" とかは、本物に直す)

string folderName = DateTime.Today.ToString("yyyyMMdd", CultureInfo.CurrentCulture);
string path = Path.Combine(@"パス", folderName);

string filePath = @"pathと同じパス";
string[] subFolders = Directory.GetDirectories(filePath, "*", SearchOption.AllDirectories);
string max = subFolders.Max();

Console.WriteLine( $"folderName={folderName}" );
Console.WriteLine( $"path={path}" );
Console.WriteLine( $"filePath={filePath}" );
Console.WriteLine( $"max={max}" );

max と path は同じ値ですか?それとも違う値ですか?
疑似コードすぎて私にはわかりませんが、この結果をみれば
どの変数を使ってCSVのパスを作ればいいかがわかると思います。

> 当初Directory.GetDirectoriesの第一引数にPath.Combineで作ったpath変数を使ってもみましたが
> CSVファイルが作れず、わざわざfilePath変数を作り結果上のようなコードになってしまいました。

subFolders = Directory.GetDirectories( path, "*", SearchOption.AllDirectories );

としてみたら、max に当たるものがうまく取り出せなかったということですか?
ちなみに、上記の場合、subFolders に入るのは、path のサブディレクトリです。

引用返信 編集キー/
■95917 / inTopicNo.7)  Re[6]: 最新のサブフォルダに保存したい
□投稿者/ 銀だこは邪道 (4回)-(2020/10/09(Fri) 08:39:30)
> としてみたら、max に当たるものがうまく取り出せなかったということですか?
> ちなみに、上記の場合、subFolders に入るのは、path のサブディレクトリです。

ああ、言われてみれば確かにそうですね。
その辺を修正してみます。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ