TTimer invalid filenameエラーの原因は?


ティモテ  2014-04-25 18:18:06  No: 46287

exeを起動するとtimStartTimer(TTimer型)内でiniファイル、データベースを読み取り
iniファイルで設定された月以上前に作成されたレコードをテーブルから削除して、削除したレコードについてはcsvファイルに出力するというプログラムがあります。

timStartTimerでエラーログを出力しているのですが、シンクライアント環境でこのプログラムを動作させた場合ここに”timStartTimer invalid filename”とエラーが出るのですが、何が原因と考えられるでしょうか。

デバッグできる普通のデスクトップPCで行ってもエラーは起きず、読み取るDBの名前を変えて読み取れなくする、csv出力先フォルダを無くす、を行っても別のエラーが出力されました。

以下ソースです。
===============================================================
procedure TRMMainForm.timStartTimer(Sender: TObject);
var
  bError: Boolean;
begin
  timStart.Enabled := False;

  GetServerInfo;

  bError := False;
  try
    DeleteOldData(Date, 0);
    DeleteOldData(Date, 1);
  except
    on E: Exception do
    begin
      OutputErrorLog(E, 'timStartTimer');
      bError := True;
    end;
  end;

  if not bError then
    SetServerInfo;

  Close;
end;
===============================================================

===============================================================
procedure TRMMainForm.DeleteOldData(SyoriDate: TDateTime; Kbn: Integer);
var
  sSyoriDate: String;
  sFileName: String;
  sFileName2: String;
  sPath: String;
  sDir: String;
  btRuiKey: TBtrieveTable;
  rData: TRuisekiKey;
  F: TextFile;
  slData: TStringList;
begin
  if Kbn = 0 then
  begin
    sPath  := FSLogPath;
    btRuiKey := TBtrieveTable.Create(FDataPath + 'DATABASE1.MKD');
  end
  else
  begin
    sPath  := FCLogPath;
    btRuiKey := TBtrieveTable.Create(FDataPath + 'DATABASE2.MKD');
  end;

  btRuiKey.DataBuffer := @rData;
  btRuiKey.DataLength := SizeOf(rData);

  slData := TStringList.Create;
  try
    btRuiKey.Open;
    try
      btRuiKey.KeyNumber := 0;

      sSyoriDate := FormatDateTime('yyyymmdd', IncMonth(SyoriDate, -FDeleteMonth));

      btRuiKey.GetFirst;
      while btRuiKey.StatusCode = 0 do
      begin
        sDir := rData.SYORI_DATE;
        if sDir >= sSyoriDate then
          Break;

        sFileName := Copy(sDir, 1, 6) + '.csv';
        sDir := Copy(sDir, 1, 4) + '\' + Copy(sDir, 5, 2);

        if not DirectoryExists(sPath + sDir) then
          ForceDirectories(sPath + sDir);

        sFileName2 := sPath + sDir + '\' + sFileName;
        AssignFile(F, sFileName2);
        if FileExists(sFileName2) then
          Append(F)
        else
          Rewrite(F);

        slData.Clear;
        slData.Add(DateString(rData.SYORI_DATE));
        slData.Add(rData.SEQ_NO);
        slData.Add(rData.PT_ID);
        slData.Add(rData.PT_KN_NAME);
        slData.Add(rData.BUMON_NO);
        slData.Add(rData.SYOHOU_KBN);
        slData.Add(rData.LINK_FILE);
        slData.Add(DateString(Copy(rData.MK_DATE, 1, 8)));
        slData.Add(TimeString(Copy(rData.MK_DATE, 9, 6)));

        Writeln(F, slData.CommaText);
        Flush(F);
        CloseFile(F);

        btRuiKey.Delete;

        btRuiKey.GetNext;
      end;
    finally
      btRuiKey.Close;
    end;

    btRuiKey.Reset;
  finally
    btRuiKey.Free;
    slData.Free;
  end;
end;
===============================================================


ティモテ  2014-04-25 19:32:21  No: 46288

環境を書き忘れていました。
開発:Delphi7
データベース:Pervasive v10
・シンクライアント環境OS
  仮想ソフト:Xen desktop
  サーバー:32bit(確かWindows Server 2008だったと思います。)
  クライアント:Windows7 32bit

・開発PC(デバッグを行ったPC):Windows7 64bit
です。


igy  2014-04-25 22:43:36  No: 46289

>”timStartTimer invalid filename”とエラーが出るのですが、何が原因と考えられるでしょうか。

エラーが発生している箇所を特定して、エラーが発生したときのファイル名を調べてみるのは、いかがですか?


ティモテ  2014-04-26 02:13:11  No: 46290

>igyさん
ありがとうございます。
やはりデバッグするしかないですかね…
シンクライアントのテスト環境が片道3時間の場所でしかできずなんとか当たりだけでもつけられないかと思ったのですが。


tor  2014-04-26 02:45:19  No: 46291

エラーメッセージがヲサ「ヲサ「ヲサだから、ファイル名やパス名がおかしいということですね。
そうすると、ファイル名やパス名を指定してファイル操作をしている箇所が怪しいということで結構絞られると思うのですが。

ヲサヲサメヒヲサコスヲサヤツヤョティニトミヲサォヲサァトチヤチツチモナアョヘヒトァゥサ
ヲサヲサメヒヲサコスヲサヤツヤョティニトミヲサォヲサァトチヤチツチモナイョヘヒトァゥサ
ヲサヲサニトィミヲサォヲサトゥサ
ヲサヲサチニィニャヲサニホイゥサ

このくらいですね。これらの文字列が想定通りになっているか
(例えばヲサァワァヲサが付くべき所に付いているかとか)確認してみてはどうでしょう。
スススススススススススススススススススススススススススススススススススススススス
ニコ ティモテ
トコ イーアエッーエッウーィ水ゥ ーケコアオコアー  書込者ノト:ロ 「。ァ。 ン

ヲサさん
ありがとうございます。

データベース名の変更をすると別のエラーが出たので
ヲサヲサメヒヲサコスヲサヤツヤョティニトミヲサォヲサァトチヤチツチモナアョヘヒトァゥサ
ヲサヲサメヒヲサコスヲサヤツヤョティニトミヲサォヲサァトチヤチツチモナイョヘヒトァゥサ
のイつは関係ないと思われます。

ヲサヲサニトィミヲサォヲサトゥサ
ヲサヲサチニィニャヲサニホイゥサ
部分に関しては試していなかったので試してみようと思います。
スススススススススススススススススススススススススススススススススススススススス
ニコ ティモテ
トコ イーアエッーエッウーィ水ゥ アアコークコウエ  書込者ノト:ロ 「。ァ。 ン

ァミァの値を存在しないドライブァレコワワァにして動作させたところ
ヲサヲサニトィミヲサォヲサトゥサ
ヲサヲサチニィニャヲサニホイゥサ
のイ行でエラーは起こらずに通過しましたが、ィ存在しなくてもエラー起きないのですねゥ
その後、
ヲサメィニゥサ
部分でエラーが発生してプログラムが終了しました。
そのエラーログを見ると
ァイーアエッーエッウーヲサーケコオウコエオヲサモヤヲサファイル名の指定が間違っていますァ
と出力されていたためどうやらこれも別のエラーのようです。
スススススススススススススススススススススススススススススススススススススススス
ニコ 
トコ イーアエッーエッウーィ水ゥ アアコオーコオイ  書込者ノト:ロ 」 ァ」ハノ

 ン

えーと、知りたいのは実際に問題のエラーが出た時に文字列の中身がどうなっているかなのですが。
「ファイル名が無効」と言っているのだから、存在するとかしないとか以前にファイル名としてはあり得ないおかしな文字列を渡してしまっている可能性がある。だからその中身を調べてみましょうということなんです。

ヲサヲサニトミヲサォヲサァトチヤチツチモナアョヘヒトァ
ヲサヲサニトミヲサォヲサァトチヤチツチモナイョヘヒトァ
ヲサヲサミヲサォヲサト
ヲサヲサニホイ
エラーが起きた時、これらの文字列の実際の中身はどうなっていましたか?デバッガで追うなり、ログに出すなりして確認してみてください。
スススススススススススススススススススススススススススススススススススススススス
ニコ ティモテ
トコ イーアエッーエッウーィ水ゥ アエコエーコエウ  書込者ノト:ロ 「。ァ。 ン

ヲサさん
入っている値の方でしたか、すみません。

ニトミにはファイルから取ってきたパスがそのまま入るため、
ヲサヲサニトミヲサォヲサァトチヤチツチモナアョヘヒトァ
ヲサヲサニトミヲサォヲサァトチヤチツチモナイョヘヒトァ

ァテコワヤナモヤワトチヤチツチモナアョヘヒトァ
ァテコワヤナモヤワトチヤチツチモナイョヘヒトァ
となっていました。
この指定先にデータベースが存在しない時、エラーログには
ヲサイーアエッーエッイエヲサアキコアウコオウヲサモヤヲサツヲサナ
ヲサマィーゥ
ヲサノヲサニヲサホィアアゥ
ヲサテコワヤナモヤワトチヤチツチモナアョヘヒト
と出力されていました。

ヲサヲサミヲサォヲサト
ヲサヲサニホイ
は、ヲサアで貼ったソースの内容で以下のように代入されるので
ヲサミヲサヲサコスヲサニモフミサヲサッッで設定されているパスを代入
ヲサトヲサコスヲサトョモルマメノ゜トチヤナサヲサッッ日付データが入っています。例コイーーエーケ
ヲサトヲサコスヲサティトャヲサアャヲサエゥヲサォヲサァワァヲサォヲサティトャヲサオャヲサイゥサ
ヲサ
ヲサニホヲサコスヲサティトャヲサアャヲサカゥヲサォヲサァョァサ
ヲサニホイヲサコスヲサミヲサォヲサトヲサォヲサァワァヲサォヲサニホサ
出力内容は
ミヲサォヲサトヲサスヲサァテコワヤナモヤワマユヤミユワイーーエワーケァ
ニホイヲサコスヲサァテコワヤナモヤワマユヤミユワイーーエワーケワイーーエーケョァ
となっていました。

ニモフミをァレコワヤナモヤワマユヤミユワァにする、
又はトョモルマメノ゜トチヤナがのデータで実行すると
エラーログには
ヲサイーアエッーエッウーヲサーケコエアコイーヲサモヤヲサファイル名の指定が間違っています
と出力されていました。

このエラーがどちらも、出力されて欲しい
ヲサイーアエッーウッーオヲサアカコウアコオクヲサモヤヲサノヲサ
とは違っていました。
スススススススススススススススススススススススススススススススススススススススス
ニコ 
トコ イーアエッーオッーアィ木ゥ アアコウアコアウ  書込者ノト:ロ 」 ァ」ハノ

 ン

うむむ、ファイル名そのものにはおかしいところはなさそうですね……後は
ヲサヲサニトィミヲサォヲサトゥサ
これが成功しているかどうかですね。ニトの返り値がか、そして指定したディレクトリが本当にできているかは確認しましたか?
(ここでディレクトリができていないと、結果的にニホイが不正なパスになります)

とりあえず現状だと「トマトのどこかで例外が発生した」という非常にざっくりした情報しかないですが
原因になり得る箇所が複数あるから、そのどれかということまで絞り込まないと話が進みません。
実環境でデバッガで追えれば話は早いのですけど、それはできないんですよね?
でもログを仕込むことはできるようですから、トマトの中の要所要所でログを出力して
「ここまでは実行できたけれど、ここでエラーになった」というのを調べてみてはどうでしょう。
スススススススススススススススススススススススススススススススススススススススス
ニコ ティモテ
トコ イーアエッーオッーアィ木ゥ アエコークコイオ  書込者ノト:ロ 「。ァ。 ン

ヲサさん

ヲサニトィミヲサォヲサトゥサ
で指定されたディレクトリは、作成できる場合は作成されていました。

レコワなど存在しないドライブだと作成されず、メィニゥサ行でエラーが起き、
ヲサイーアエッーオッーアヲサアウコエケコアイヲサモヤヲサファイル名の指定が間違っています
とエラーログに出力されます。

ニホイにァテワヤナモヤワマユヤミユヤワヲサヲサヲサヲサワヲサヲサワヲサヲサヲサョァ
のようにトョモルマメノ゜トチヤナがヌルだった場合、フォルダ名がヌルのフォルダが指定箇所にできますが、ファイル名がヌルのョを作れないせいか、メィニゥサ行でエラーが起き、
ヲサイーアエッーオッーアヲサアウコオイコーウヲサモヤヲサファイル名の指定が間違っています
とエラーログに出力されます。

実環境でデバッグで追うことができないため、思いつく限りトマト関数でエラーになるようなデータ、環境を作ってログを確認してみます。
ありがとうございます。
スススススススススススススススススススススススススススススススススススススススス
ニコ 
トコ イーアエッーオッーイィ金ゥ ーーコエアコイア  書込者ノト:ロ 「」「 。 ン

例えば、ファイル名の一部にヲサ「ッ「ヲサの文字が含まれる場合は、どうなりますか?
スススススススススススススススススススススススススススススススススススススススス
ニコ ティモテ
トコ イーアエッーオッーイィ金ゥ アオコアカコオア  書込者ノト:ロ 「。ァ。 ン

ヲサさん

トョモルマメノ゜トチヤナヲサスヲサァイーーエッーケーァ
という値が入っていた場合、
ニホヲサスヲサァイーーエッーョァ
トヲサスヲサァイーーエワッーァ
となります。

ヲサニトィミヲサォヲサトゥサ
行が実行された時、ッは無視されて
ァテワヤナモヤワマユヤミユヤワイーーエワーァ
フォルダが作成されます。

ニホイヲサスヲサァテワヤナモヤワマユヤミユワイーーエワッーワイーーエッーョァ
となり、
ヲサメィニゥサ
を通るときにエラーが起きます。

エラーログには
ヲサイーアエッーオッーイヲサアエコオオコオエヲサモヤヲサファイル名の指定が間違っています
と出力されていました。

トョモルマメノ゜トチヤナヲサスヲサァイーーエッッーケァ
として、
トヲサスヲサァイーーエワッッァ
となるような状態でも、
ァテワヤナモヤワマユヤミユヤワイーーエワ
フォルダまでは作成され、同じ個所で同じエラーとなりました。
スススススススススススススススススススススススススススススススススススススススス
ニコ 
トコ イーアエッーオッーイィ金ゥ アオコウオコオケ  書込者ノト:ロ 」 ァ」ハノ

 ン

コメントを見ていると、どうもティモテさんは
ィチゥヲサ実環境でエラーが発生した時に何が起きているか
を調べるのではなく
ィツゥヲサ手元のミテ環境で、どうやったら同じエラーを再現できるか
から原因を探ろうとしているように見えます。

で、実環境と同じヲサ「ヲサ「ヲサというメッセージにならないため
何とか同じエラーを出そうと頑張っているようですが……
手元のミテで出ていると思われる「ファイル名の指定が間違っています」って
日本語か英語か違うだけで、要は同じメッセージじゃないですか?
スススススススススススススススススススススススススススススススススススススススス
ニコ ティモテ
トコ イーアエッーオッーイィ金ゥ アカコアウコアク  書込者ノト:ロ 「。ァ。 ン

ヲサさん
まさにその通りです…
同じエラーならば全く同じエラーログが出力されると思っていたのですが、そういうわけでもないのでしょうか?
現地のマモの環境では英語で出力されるが、現在デバッグしている環境では日本語で出力されているだけで、同じエラーということ…?ィマモ等の環境により出力され方が違う?)


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加