別 の プロセス で 使用 され て いる ため。 別のプログラムがこのフォルダーまたはファイルを開いているので・・・の原因と解決方法

CubePDF の基本的な使用方法について (FAQ)

別 の プロセス で 使用 され て いる ため

原因は何ですか? エラーメッセージはきわめて明確です。 ファイルにアクセスしようとしていますが、別のプロセス(または同じプロセス)が何かをしている(そして共有を許可していない)ため、アクセスできません。 デバッグ あなたの特定のシナリオに応じて、解決するのはかなり簡単かもしれません(またはかなり理解しにくいかもしれません)。 いくつか見てみましょう。 あなたのプロセスはそのファイルにアクセスする唯一のプロセスです 他のプロセスは自分 のプロセスであると確信しています。 あなたがあなたのプログラムの別の部分でそのファイルを開くことを知っていれば、まず各使用の後にファイルハンドルを適切に閉じることを確認する必要があります。 このバグのコードの例を次に示します。 Open "myfile. txt", FileMode. すべてがうまくいくようであれば(例外があっても開いているすべてのファイルを必ず閉じてください)、作業スレッドが複数ある場合は、次の2つのオプションがあります。 ファイルアクセスを直列化するコードを書き直しますwant)または 再試行パターンを適用します。 何かをしようとするとエラーが発生した場合は、待機してもう一度やり直してください(たとえば、Windows Shellがファイルが使用中であること削除できませんか?)。 Thread. Open path, FileOpen. ReadAllText path ; この場合、 ReadAllText はファイルが使用中であるため失敗します(前の行の File. Open )。 あらかじめファイルを開くだけでは不必要なだけでなく間違っている。 File. ReadAllText 、 File. WriteAllText 、 File. ReadAllLines 、 File. WriteAllLines などのように、作業中のファイルへの ハンドルを返さないすべての File関数にも同じことが適用されます。 File. AppendAllXyz 関数)は、すべてそれ自身でファイルを開いたり閉じたりします。 プロセスがそのファイルにアクセスする唯一のプロセスではありません あなたのプロセスがそのファイルにアクセスする唯一のプロセスでない場合、対話はより困難になる可能性があります。 再試行パターンが役立ちます(ファイルが誰にも公開されていない場合は、プロセスエクスプローラのようなユーティリティが必要です)。 回避する方法 適用可能な場合は、常に usingステートメントを使用してファイルを開きます。 前の段落で述べたように、多くの一般的なエラーを避けるため積極的に役立ちます( この記事では、 使用しない方法の例を参照してください)。 可能であれば、特定のファイルへのアクセスを所有している人を決定し、いくつかのよく知られている方法でアクセスを一元管理してください。 デバッグが簡単になります(いつでもブレークポイントを設定して誰が何をしているのか見ることができます)。 また、複数のアクセスのための同期ポイント(必要な場合)になります。 一般的な例は次のとおりです。 if File. Exists path File. Delete path ; 誰かが File. Exists 後で File. Exists 前にファイルを削除すると、誤って安全に感じられるかもしれない場所に IOExceptionがスローされます。 可能であれば、 再試行パターンを適用し、 FileSystemWatcherを使用している場合は、アクションを延期することを検討してください(通知を受けるため、アプリケーションはそのファイルで排他的に動作している可能性があります)。 高度なシナリオ 必ずしも簡単ではないので、他の人とアクセスを共有する必要があるかもしれません。 たとえば、最初から読んでいて最後に書いている場合は、少なくとも2つのオプションがあります。 1) は ( スレッドセーフではないため)適切な同期関数を使用して同じ FileStreamを共有します。 例については、 thisとthis記事を参照してください。 2) FileShare列挙を使用して、OSに他のプロセス(または自分のプロセスの他の部分)が同じファイルに同時にアクセスできるように指示します。 Open path, FileMode. Open, FileAccess. Write, FileShare. 重複を読み書きすると、定義されていない、または無効なデータになることに注意してください。 また、これは streamへのアクセスをスレッドセーフにしないので、アクセスが何らかの方法で同期されていない限り、このオブジェクトを複数のスレッドと共有することはできません(前のリンクを参照)。 他の共有オプションも利用でき、より複雑なシナリオを開くことができます。 詳細については、 を参照してください。 一般に、 N個のプロセスはすべて同じファイルから読み込むことができますが、1つだけ書く必要があります。 制御されたシナリオでは、並行書き込みを有効にすることさえできますが、この答え内のテキスト段落では一般化できません。 別のプロセスで使用されているファイルの ロックを 解除することはできますか? それは常に安全ではなく、簡単ではありませんが、 可能です。

次の

ファイルをロック(アクセスを制限)する

別 の プロセス で 使用 され て いる ため

ファイルをロック(アクセスを制限)する ファイルを開いているときに、そのファイルの内容が他のプロセスから勝手に変更されては困るというケースは多いでしょう。 を指定してでファイルを開けば、そのファイルへのアクセスをどのように制限するか(読み込みのみを制限するか、書き込みのみを制限するか、両方制限するか、何も制限しないか)を変更できます。 この制限は、Closeメソッドでファイルを閉じるまで有効です。 なお、FileStreamでファイルを開く方法については、「」で詳しく説明していますので、そちらをご覧ください。 以下の例では、ファイルを閉じるまで、書き込み、読み込みすべてのアクセスを禁止しています。 このような方法でファイルを開いている最中に別のプロセス(または自分のプロセス)がファイルを開こうとすると、例外System. IOExceptionが発生します。 txt" 'ファイルを開く Dim fs As New System. FileMode. FileAccess. FileShare. None 'ファイルを読み込むバイト型配列を作成する Dim bs fs. Length - 1 As Byte 'ファイルの内容をすべて読み込む fs. Read bs, 0, bs. Length '閉じる fs. FileStream fileName, System. FileMode. Open, System. FileAccess. Read, System. FileShare. Read bs, 0, bs. Close ; 以下にFileShare構造体のメンバとその意味を表にまとめます。 FileShareのメンバ 説明 None ファイルを閉じるまで、別プロセスやこのプロセスからの読み込み、書き込みを禁止する。 Read ファイルを閉じるまで、別プロセスやこのプロセスからの書き込みを禁止し、読み込みは許可する。 ReadWrite 別プロセスやこのプロセスからの読み込み、書き込みを許可する。 Write ファイルを閉じるまで、別プロセスやこのプロセスからの読み込みを禁止し、書き込みは許可する。 Delete 削除を許可する。 Windows 9x系では失敗する。. NET Framework 2. 0で追加。 Inheritable 子プロセスで継承できるようにする。 StreamReaderで開いたファイルをロックしない 「」で紹介したようにStreamReaderを使ってファイルを開いたとき、開いているファイルは別のプロセスから読み込むはできますが、書き込みはできません。 これを読み込みも書き込みも制限しないようにするには、FileShare. ReadWriteを指定してFileStreamオブジェクトを作成します。 このFileStreamオブジェクトを基にしてStreamReaderオブジェクトを作成すれば、StreamReaderを使用してファイルを読み込むことができます。 txt" 'ファイルを開く Dim fs As New System. FileMode. FileAccess. FileShare. ReadWrite 'FileStreamを基にしたStringReaderのインスタンスを作成 Dim enc As System. Text. Text. Encoding. ReadToEnd '閉じる 'srを閉じれば、基になるfsも閉じられる sr. FileStream fileName, System. FileMode. Open, System. FileAccess. Read, System. FileShare. Text. Text. Encoding. Close ; StreamWriterクラスでファイルを書き込むときも全く同じ方法で、FileShareを変更したFileStreamを基にしてStreamWriterオブジェクトを作成することができます。 ファイルの一部をロックする FileStreamで開いているファイルの一部をロックする方法として、が用意されています。 アンロックするときは、を呼び出します。 Lockメソッドでファイルの一部をロックしたとき、別のプロセスからはロックした部分以外からの読み込みはできても、ロックした部分から読み込もうとすると例外IOExceptionがスローされます。 (自分のプロセスであっても、別のFileStreamであれば同様です。 ) Lockメソッドでロックされていない部分をロックすることはできますが、すでにロックされている部分をロックしようとすると、一部が重なるだけであっても、IOExceptionがスローされます。 Unlockメソッドで指定する位置と長さは、Lockメソッドで指定した位置と長さと完全に一致する必要があります。 もし違っていた場合は、IOExceptionがスローされます。 下のサンプルは、Lockメソッドでファイルをロックするテストを行うものです。 フォームにボタンが4つ配置してあるとして、Button1でファイルの一部をロックし、Button2でアンロックし、Button3でロックする範囲にないデータを読み込み、Button4でロックする範囲にあるデータを読み込んでいます。 このアプリケーションを2つ起動し、一方でButton1をクリックしてファイルをロックすると、もう一方ではButton4で読み込みができなくなることを確認できます。 JavaScriptを有効にしてください 'バッファを10バイトにしてFileStreamオブジェクトを作成 Private testStream As New System. FileMode. FileAccess. FileShare. EventArgs Handles Button1. Click Try '11バイト目から20バイトロックする testStream. Lock 10, 20 MessageBox. Show "Lockしました" Catch ex As System. IOException MessageBox. Show ex. EventArgs Handles Button2. Click Try 'アンロックする testStream. Unlock 10, 20 MessageBox. Show "Unlockしました" Catch ex As System. IOException MessageBox. Show ex. EventArgs Handles Button3. Click Try '先頭から1バイトを読み込む 'ただしバッファが10バイトなので、10バイト読み込まれる 'ロックされていない範囲にある testStream. Seek 0, System. SeekOrigin. Begin MessageBox. Show testStream. ReadByte. ToString Catch ex As System. IOException MessageBox. Show ex. EventArgs Handles Button4. Click Try '30バイト目から1バイトを読み込む 'ロックされている位置にある testStream. Seek 29, System. SeekOrigin. Begin MessageBox. Show testStream. ReadByte. ToString Catch ex As System. IOException MessageBox. Show ex. Windows. Forms. FormClosedEventArgs testStream. Close MyBase. OnFormClosed e End Sub '. NET Framework 1. 1以前 'Protected Overrides Sub OnClosed ByVal e As System. EventArgs ' testStream. Close ' MyBase. txt", System. FileMode. Open, System. FileAccess. Read, System. FileShare. Lock 10, 20 ; MessageBox. Show ex. Unlock 10, 20 ; MessageBox. Show ex. Seek 0, System. SeekOrigin. Begin ; MessageBox. Show testStream. ReadByte. Show ex. Seek 29, System. SeekOrigin. Begin ; MessageBox. Show testStream. ReadByte. Show ex. Close ; base. NET Framework 1. これは、FileStreamのバッファが10バイトより大きくなり、ロックされている範囲のデータまで読み込もうとするためです。 ちなみにFileStreamのバッファのサイズは8バイト未満にすることができず、8未満の値を指定したときは8バイトになります。 Microsoft Officeなどが開いているファイルを開く WordやExcelなどで現在開いているファイルをFileStreamで読み込もうとすると、例外System. IOException(「別のプロセスで使用されているため、プロセスはファイル '(ファイルのパス)' にアクセスできません。 」)が発生します。 これを回避するには、FileShare. ReadWriteを指定してファイルを開きます。 Microsoft Office以外でもこの方法が使えるかもしれませんが、アプリケーションがどのようにファイルをロックしているかによりますので、当然使えないこともあります。 お手数ですが、ご自分でご確認ください。 (コメントでご報告をいただけると、ありがたいです。 関連:• 履歴:•

次の

プロセスはファイルにアクセスできません。別のプロセスが使用中です、と表示される

別 の プロセス で 使用 され て いる ため

原因は何ですか? エラーメッセージはきわめて明確です。 ファイルにアクセスしようとしていますが、別のプロセス(または同じプロセス)が何かをしている(そして共有を許可していない)ため、アクセスできません。 デバッグ あなたの特定のシナリオに応じて、解決するのはかなり簡単かもしれません(またはかなり理解しにくいかもしれません)。 いくつか見てみましょう。 あなたのプロセスはそのファイルにアクセスする唯一のプロセスです 他のプロセスは自分 のプロセスであると確信しています。 あなたがあなたのプログラムの別の部分でそのファイルを開くことを知っていれば、まず各使用の後にファイルハンドルを適切に閉じることを確認する必要があります。 このバグのコードの例を次に示します。 Open "myfile. txt", FileMode. すべてがうまくいくようであれば(例外があっても開いているすべてのファイルを必ず閉じてください)、作業スレッドが複数ある場合は、次の2つのオプションがあります。 ファイルアクセスを直列化するコードを書き直しますwant)または 再試行パターンを適用します。 何かをしようとするとエラーが発生した場合は、待機してもう一度やり直してください(たとえば、Windows Shellがファイルが使用中であること削除できませんか?)。 Thread. Open path, FileOpen. ReadAllText path ; この場合、 ReadAllText はファイルが使用中であるため失敗します(前の行の File. Open )。 あらかじめファイルを開くだけでは不必要なだけでなく間違っている。 File. ReadAllText 、 File. WriteAllText 、 File. ReadAllLines 、 File. WriteAllLines などのように、作業中のファイルへの ハンドルを返さないすべての File関数にも同じことが適用されます。 File. AppendAllXyz 関数)は、すべてそれ自身でファイルを開いたり閉じたりします。 プロセスがそのファイルにアクセスする唯一のプロセスではありません あなたのプロセスがそのファイルにアクセスする唯一のプロセスでない場合、対話はより困難になる可能性があります。 再試行パターンが役立ちます(ファイルが誰にも公開されていない場合は、プロセスエクスプローラのようなユーティリティが必要です)。 回避する方法 適用可能な場合は、常に usingステートメントを使用してファイルを開きます。 前の段落で述べたように、多くの一般的なエラーを避けるため積極的に役立ちます( この記事では、 使用しない方法の例を参照してください)。 可能であれば、特定のファイルへのアクセスを所有している人を決定し、いくつかのよく知られている方法でアクセスを一元管理してください。 デバッグが簡単になります(いつでもブレークポイントを設定して誰が何をしているのか見ることができます)。 また、複数のアクセスのための同期ポイント(必要な場合)になります。 一般的な例は次のとおりです。 if File. Exists path File. Delete path ; 誰かが File. Exists 後で File. Exists 前にファイルを削除すると、誤って安全に感じられるかもしれない場所に IOExceptionがスローされます。 可能であれば、 再試行パターンを適用し、 FileSystemWatcherを使用している場合は、アクションを延期することを検討してください(通知を受けるため、アプリケーションはそのファイルで排他的に動作している可能性があります)。 高度なシナリオ 必ずしも簡単ではないので、他の人とアクセスを共有する必要があるかもしれません。 たとえば、最初から読んでいて最後に書いている場合は、少なくとも2つのオプションがあります。 1) は ( スレッドセーフではないため)適切な同期関数を使用して同じ FileStreamを共有します。 例については、 thisとthis記事を参照してください。 2) FileShare列挙を使用して、OSに他のプロセス(または自分のプロセスの他の部分)が同じファイルに同時にアクセスできるように指示します。 Open path, FileMode. Open, FileAccess. Write, FileShare. 重複を読み書きすると、定義されていない、または無効なデータになることに注意してください。 また、これは streamへのアクセスをスレッドセーフにしないので、アクセスが何らかの方法で同期されていない限り、このオブジェクトを複数のスレッドと共有することはできません(前のリンクを参照)。 他の共有オプションも利用でき、より複雑なシナリオを開くことができます。 詳細については、 を参照してください。 一般に、 N個のプロセスはすべて同じファイルから読み込むことができますが、1つだけ書く必要があります。 制御されたシナリオでは、並行書き込みを有効にすることさえできますが、この答え内のテキスト段落では一般化できません。 別のプロセスで使用されているファイルの ロックを 解除することはできますか? それは常に安全ではなく、簡単ではありませんが、 可能です。

次の