アプリ版:「スタンプのみでお礼する」機能のリリースについて

コピーする複数のファイルに共通する部分を修正してから、別のフォルダーに書き込むことを考えていますので、
  System.IO.File.Copy
は使わず、コピー元のファイルを読み込んだテキストをコピー先に書き込むために以下のようにコーディングしたのですが、すぐエラーになります。どこがおかしいのでしょうか?

private void BtnTextCopy_Click(object sender, EventArgs e)
{
  string SourceDir = @"C:\MyTools\BASICw32\STATEMEN\";
  string TargetDir = @"D:\___TempPictures2022\";

  try
  {
    var txtFiles = Directory.EnumerateFiles(SourceDir, "*.bas");
    foreach (string currentFile in txtFiles)
    {
      string RFName = currentFile.Substring(SourceDir.Length + 1);
      string WFName = currentFile.Substring(TargetDir.Length + 1);
      TextMemo.AppendText(RFName + "\r\n"); //ファイル名確認

      //読み込み
      FileStream rfs = new FileStream(RFName, FileMode.Create);
      StreamReader sr = new StreamReader(rfs);
      string text = sr.ReadToEnd();

      //書き込み
      FileStream wfs = new FileStream(WFName, FileMode.Create);
      StreamWriter sw = new StreamWriter(wfs);
      sw.WriteLine(text);

      sr.Close();
      rfs.Close();
      sw.Close();
      wfs.Close();
    }
  }
  catch
  {
    MessageBox.Show("ファイルの処理に失敗しました。", "エラー",
             MessageBoxButtons.OK, MessageBoxIcon.Error);
  }
}

質問者からの補足コメント

  • うーん・・・

    デバッガで追ったら書き込みのところでエラーになります。

      補足日時:2022/11/21 13:36
  • うーん・・・

    string RFName = SourceDir+currentFile.Substring(SourceDir.Length + 1);
    string WFName = TargetDir+currentFile.Substring(TargetDir.Length + 1);

    と修正しましたがやはりだめです。

      補足日時:2022/11/21 13:45
  • うーん・・・

    すみません。このコードいろいろ問題が発生します。
    コピー元のフォルダーにもファイルが追加・もしくは上書きされてしまいます。リストアップしたファイル以外の名前のファイルが作成されます。
    とりあえず質問を打ち切り、改めて質問し直します。

      補足日時:2022/11/21 15:00

A 回答 (4件)

System.IO.Pathを使いましょう。


フルパスの入った文字列でSubstring()で変に切り出すよりマシです。

GetFilename()やCombine()でファイル名を操作すべきかと。

>string text = sr.ReadToEnd();
>で text が "" になってしまいます。何でかな?

空ファイルだからでしょう。

>FileStream rfs = new FileStream(RFName, FileMode.Create);

FileMode.Createがどういう指定か確認すべきかと。
StreamReaderクラスだけで大丈夫だと思いますけどね。
    • good
    • 0
この回答へのお礼

丁寧な回答まことにありがとうございました。
 使い捨てのプログラムなので、とりあえずこれでいきます。

(修正したところ)
  string FName = Path.GetFileName(currentFile);
  string RFName = SourceDir + FName;
  string WFName = TargetDir + FName;
  TextMemo.AppendText(RFName + "\r\n");
  FileStream rfs = new FileStream(RFName, FileMode.Open);
  StreamReader sr = new StreamReader(rfs, Encoding.GetEncoding("shift-jis"));
  //十進BASICのソースが shift-jis なため
  string text = sr.ReadToEnd();

お礼日時:2022/11/21 20:10

ファイル名が正しいことを, 本当に「確認」してる?



Substring の引数が
SourceDir.Length + 1
なのはなぜ?
    • good
    • 0

ファイル名が正しいことは確認してるの?

    • good
    • 0
この回答へのお礼

確認してませんでしたww

string FName = currentFile.Substring(SourceDir.Length + 1);
string RFName = SourceDir + FName;
string WFName = TargetDir + FName;

とすべきでした。これで解決と思ったのですが

string text = sr.ReadToEnd();

で text が "" になってしまいます。何でかな?

お礼日時:2022/11/21 14:27

どういう理由でエラーになっているのかな?



ファイル名, 正しいのかなぁ....
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!