問題タブ [tfilestream]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
delphi - TFileStreamをフラッシュする方法は?
TFileStreamはバッファリングされた出力を提供します。これはほとんどの場合に最適ですが、場合によっては(特にデバッグ中)、バッファをすぐにフラッシュすると便利です。物事は、私はそれを行う方法を知りませんが、Freeを呼び出すことは一種の逆効果です。
それを行うためのより良い方法はありますか?
delphi - (ワイド)文字列-TFileStream、Delphi 7に保存します。最速の方法は何ですか?
Delphi7(非ユニコードVCL)を使用しているので、TFileStream内に多くのWideStringを格納する必要があります。(ワイド)文字列がバイナリデータと混合されているため、TStringStreamを使用できません。この形式は、データの読み込みと書き込みを高速化すると予測されています...ただし、文字列の読み込み/書き込みの現在の方法は、私のコードのボトルネック..。
現在、文字列の長さを書き込んでから、charごとに書き込んでいます...ロード中に、最初に長さをロードし、次にcharごとにロードしています...
では、WideStringをTFileStreamに保存してロードする最速の方法は何ですか?
前もって感謝します
delphi - tfilestream.seekとオフセットの混乱
これは、 https://forums.embarcadero.com/message.jspa? messageID= 219481から取得したコードスニペットです。
正確にオフセットされているものと、プレースホルダーにMax(0、Fs.Size-1024)が含まれている理由、および以下に移動した場合(コード内)がわかりません
'-1024'とは正確には何ですか...なぜ常に1024/-1024を使用するのですか?オフセットペースホルダーの作業ではfs.sizeだけで(一時停止の再開をサポートしてダウンロードを管理するようにしています)、上記のコードでtfilestreamをtmemmorystreamに置き換えると、プログラムに影響がありますか?
重要な場合:私はd2007とd2010を使用します
delphi - どこかでファイルストリームのインスタンスを解放すると、ファイルが受信されませんか?
TServerSocket
/を使用してファイルを送信しようとしていますTClientSocket
。どこでもファイルストリームを解放しない限り、ファイルは完全に送信されform.OnCreate
ます。イベントも意味します。私がどこでも自由にすると、1 パーセントか 2 パーセントしか送られません。
TFileStream.Create
また、サーバー側OnCreate
イベントにコード行を配置する必要があります。ストリームを作成すると、TForm2.ServerSocket1ClientRead
「EFcreateerror
別のプロセスで使用されているため、プロセスはファイルにアクセスできません」というメッセージが表示されます。
コードをこのように配置しても:
それでも問題が発生します。
この奇妙な現象は何ですか?Delphiのバグですか?はいの場合、回避策はありますか? 問題がある場合: Delphi 2010 を使用しています。
更新:申し訳ありませんが、コードを次のように配置した場合:
申し訳ありませんfstream.size
が、ではありませんfilesize
。ファイル サイズを 300000 (受信するファイルのサイズ) として既に初期化しています。
解決済み:置き換えて解決
と
delphi - Delphi TFileStream.Seek、無効なシークオフセットをチェックする方法
Delphi 2006でTFileStreamを使用しています。範囲外のオフセットを使用してTFileStream.Seekを呼び出すと、異なる戻り値が返されます。ストリームの先頭より下の位置をシークすると、関数は-1を返し、ストリームサイズを超えてシークすると、この関数は、ストリームがそれほど大きい場合のストリーム内の位置を返します。ストリームでのシーク操作が成功したかどうかを確認する方法はありますか?シークオフセットが現在のストリームサイズの範囲外である場合、TFileStream.Seekが失敗しないのはなぜですか?
前もって感謝します。
delphi - tfilestream が解放されたかどうかを検出する方法は?
tfile ストリームのインスタンスが使用されているかどうかを確認する方法はありますか? たとえば、タイプ tfilestream の FS を宣言し、そこにバッファを書き込み、最後に tfilestream.free を使用してストリームを解放すると、次のように確認できます。
activeメソッドとbeingusedメソッドは実際には存在せず、 tfilestream.free = trueをテストすることもできません
delphi - FileStream 作成時の例外処理方法
私はリファクタリングしたいこのような関数を持っています
質問:
上記の手順 SomeOtherCode 内のコメントを参照してください。
よろしくお願いします
delphi - Delphiで巨大なファイルを読み取るための最速の方法は何ですか?
私のプログラムは、ランダムアクセスで巨大なバイナリファイルからチャンクを読み取る必要があります。数千のエントリがある可能性のあるオフセットと長さのリストがあります。ユーザーがエントリを選択すると、プログラムはオフセットを探して長さバイトを読み取ります。
プログラムは内部でTMemoryStreamを使用して、ファイルから読み取られたチャンクを格納および処理します。データの読み取りは、次のようにTFileStreamを介して行われます。
これは正常に機能しますが、残念ながら、ファイルが大きくなるにつれて速度が低下します。ファイルサイズは数メガバイトから始まりますが、数十ギガバイトに達することがよくあります。読み取られるチャンクのサイズは約100キロバイトです。
ファイルの内容は私のプログラムによってのみ読み取られます。現時点でファイルにアクセスしているのはこのプログラムだけです。また、ファイルはローカルに保存されるため、これはネットワークの問題ではありません。
WindowsXPボックスでDelphi2007を使用しています。
このファイルアクセスを高速化するにはどうすればよいですか?
編集:
- ファイルのどの部分が読み取られているかに関係なく、大きなファイルのファイルアクセスは低速です。
- プログラムは通常、ファイルを順番に読み取りません。チャンクの順序はユーザー主導であり、予測することはできません。
- 小さなファイルから同じように大きなチャンクを読み取るよりも、大きなファイルからチャンクを読み取る方が常に遅くなります。
- 私は、ファイル全体を処理するのにかかる全体的な時間ではなく、ファイルからチャンクを読み取るためのパフォーマンスについて話しています。後者は明らかに大きなファイルの場合は時間がかかりますが、それはここでは問題ではありません。
皆さんに謝罪する必要があります。メモリマップトファイルを使用してファイルアクセスを実装した後、提案されたように、大きな違いはないことがわかりました。しかし、タイミングコードを追加した後、プログラムの速度を低下させるのはファイルアクセスではないことも判明しました。ファイルへのアクセスには、ファイルサイズに関係なく、実際にはほぼ一定の時間がかかります。ユーザーインターフェイスの一部(まだ特定していません)には、大量のデータでパフォーマンスの問題があるようで、最初にプロセスを実行したときに、どういうわけか違いを確認できませんでした。
ボトルネックを特定するのが面倒でごめんなさい。
delphi - オフセット付きのTFileStream
0オフセットからではなく、ユーザー定義のオフセットからファイルを処理できるように、TFileStreamを拡張する必要があります。つまり、ユーザー定義のオフセットをストリームの開始として解釈する必要があります。私のコードは次のとおりです。
しかし、それは適切に機能しません。問題はシーク機能にありますが、理由はわかりません。そのようなストリームをサードパーティコンポーネントに渡すと、TSuFileStream.Offset:=0の場合にのみ機能します。
delphi - ファイルをストリームにロードするときにDelphiHTTPアプリがエラーを発生させる
私は(を介して)HTTP Webサーバーアプリケーションに取り組んでいますが、クライアントに送り返すためにTIdHTTPWebBrokerBridge
ファイルをストリーム()にロードすることに関して少し問題があります。TFileStream
毎回発生するわけではありませんが、かなりランダムに発生します...例外が発生し続けます...
Cannot open file "C:\SomePath\SomeFile.html". The process cannot access the file because it is being used by another process
それはこの行で起こります:
Str:= TFileStream.Create('C:\SomePath\SomeFile.html', fmOpenRead);
(StrはTFileStream
)
私はメッセージがそれ自体を物語っていると思いますが、私は絶対にそれを避ける必要があります。この例外はデバッグモードでのみ発生しますが、このメッセージが常に表示されることを心配せずに、このことをデバッグする必要があります。
不思議なことに、ほとんどの場合、ファイルはロードされ、とにかく返送されます。
どうすればこれを回避できますか?また、読み取り専用であっても、複数回開くことができないのはなぜですか?