2010-02-08 146 views
15

我從SQL Server數據庫字段獲取二進制數據,並且在我的應用程序有權限的目錄中本地創建文檔。不過,我仍然收到標題中指定的錯誤。我已經嘗試過在網絡上發佈的很多建議,包括Stackoverflow之前的文章中提到的建議。我還使用ProcessExplorer> Find Handle來查找鎖定,並且它不返回文件,就好像該文件未被鎖定一樣。該進程無法訪問該文件,因爲它正在被另一個進程使用

我正在使用下面的代碼將文件保存到文件系統,然後嘗試在稍後在另一個方法中的應用程序進程中將此文件複製到新位置。正是這種複製方法取得了引發異常的新創建文件的路徑。

文件本身是用它的內容創建的,我可以通過Windows資源管理器打開它,沒有任何問題。

我錯過了一些完全明顯的東西嗎?我是從數據庫中正確創建文件嗎?任何幫助解決或更好地診斷問題將不勝感激。

// Get file from DB 
FileStream fs = new FileStream(
    "C:\myTempDirectory\myFile.doc", FileMode.OpenOrCreate, FileAccess.Write); 
BinaryWriter br = new BinaryWriter(fs); 
br.Write("BinaryDataFromDB"); 
fs.Flush(); 
fs.Close(); 
fs.Dispose(); 

// Copy file 
File.Copy(sourceFileName, destinationFilename, true); 
+0

你會發布實際的代碼嗎?似乎有一個看不見的問題,可能是隱藏在別處...... – Bloodyaugust 2010-02-08 22:21:01

+0

我知道你可能只是爲了你的問題做了一個文本替換,但是你的文件路徑應該是'@「C:\ myTempDirectory \ myFile.doc 「'因爲反斜槓轉義。 – Jacob 2010-02-08 22:32:23

+0

你確定這個異常不是在討論另一個進程正在使用的destinationFilename嗎? – Jacob 2010-02-08 22:39:44

回答

28

嘗試增加以GC.Collect()呼叫你佈置你的流後強制垃圾收集器清理。

// Get file from DB 
using(FileStream fs = new FileStream("C:\myTempDirectory\myFile.doc", FileMode.OpenOrCreate, FileAccess.Write)) 
using(BinaryWriter br = new BinaryWriter(fs)) 
{ 
    br.Write("BinaryDataFromDB"); 
    fs.Flush(); 
} 

//Force clean up 
GC.Collect(); 

// Copy file 
File.Copy(sourceFileName, destinationFilename, true); 
+0

非常感謝,似乎已經做到了。然而,某些地方一定是錯的,因爲即使在我調用close()之後它仍然保持着它。至少我可以進入下一階段的問題。非常感謝所有幫助我深入瞭解它的人,非常感謝。我今晚會睡得很好:) – Cragly 2010-02-08 22:48:34

+12

有人可以解釋爲什麼在Dispose()中沒有立即關閉流嗎? – Kugel 2013-04-05 01:28:49

+5

GC.Collect()=>這就是EVIL! – user384080 2013-05-29 00:57:16

1

是不是Filestream和BinaryWriter不能同時使用?例如,Streamwriter和StreamReader不能同時在同一個文件上調用。然而,就我所知,這沒有意義,它不應該在這種情況下。也許嘗試關閉br?

1

嘗試在複製之前處理BinaryWriter對象。

+0

沒有運氣的傢伙。我在BinaryWriter上做了Flush()和Close(),但仍然得到相同的錯誤。 – Cragly 2010-02-08 22:02:50

+0

但是如何處置Dispose? – 2010-02-08 22:12:16

1

是否存在後臺進程,如防病毒或文件系統索引鎖定文件的時間足夠長以致導致應用程序出現問題?嘗試暫停3秒,看看你的問題是否消失。

using System.Threading; 

fs.Dispose(); 
Thread.Sleep(3000); 
// Copy file 
+0

不!發生同樣的事情。現在開始讓我瘋狂...... – Cragly 2010-02-08 22:15:40

3

using怎麼樣?

string source = @"C:\myTempDirectory\myFile.doc"; 
using(FileStream fs = new FileStream(
    source, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Read)) 
{ 
    BinaryWriter br = new BinaryWriter(fs); 
    br.Write("BinaryDataFromDB"); 
} 

File.Copy(sourceFileName, destinationFilename, true); 

編輯:儘量通知FileShare.Read許可。

+0

在BinaryWriter上使用怎麼樣? – 2010-02-08 22:14:59

+0

沒有工作我害怕。即使在FileStream和BinaryWriter上使用和不使用Close()也可以使用它。 – Cragly 2010-02-08 22:16:41

+1

添加'FileShare.Read' *似乎*已經解決了問題*對我來說* – 2014-03-21 14:40:07

4

更改您的代碼如下,問題是,文件流不被垃圾回收,當你需要它:

// Get file from DB 
using (FileStream fs = new FileStream("C:\myTempDirectory\myFile.doc", FileMode.OpenOrCreate, FileAccess.Write)) 
{ 
    BinaryWriter br = new BinaryWriter(fs); 
    br.Write("BinaryDataFromDB"); 
    fs.Flush(); 
    fs.Close(); 
} 

// Copy file 
File.Copy(sourceFileName, destinationFilename, true); 
+0

沒有喜悅不幸!這應該是一件很簡單的事情。非常感謝你所有的努力人物。 – Cragly 2010-02-08 22:20:46

3

我才明白,雖然錯誤調試器說,錯誤就出在這代碼..但是,這並不是錯誤所在.. 我遇到類似的問題,我想出了這個解決方案。 。考慮上述所有職位.. 可能是它可以幫助一些一..


我使用的圖像從數據庫retreiving並將其保存爲「溫度後,顯示它在PictureBox。BMP」使用正常的編碼,而不使用‘使用’關鍵字使用在第一個驗證碼:

PictureBox1.Image = Image.FromFile("temp.bmp"); 

,使其上升和錯誤,我真的沒有了頭和錯誤的尾巴..等我想出了這個解決方案


不是指定它直接試試這個代碼:

Bitmap img; 
using (Bitmap bmp = new Bitmap("temp.bmp")) 
{ 
    img = new Bitmap(bmp); 
} 
pictureBox1.Image = img; 

來的文件流部分,我只是用正常的代碼如下:

FileStream fs = new FileStream("filepath",FileMode.Create); 

和它的工作就像一塊蛋糕


它真的幫助

+0

感謝Murali。我可以看到如何將這個值分配給一個新的對象,然後分配那些不屬於using語句的對象值。感謝您的更新,並希望對其他遇到同樣問題的人有用。 – Cragly 2012-03-25 16:58:57

0

我是這樣做的:

Stream stream = new MemoryStream(); 
var tempStream = new FileStream(pathToFile, FileMode.Open); 
tempStream.CopyTo(stream); 
tempStream.Close(); 

然後使用stream任意位置的對象。

-1

我似乎只有在我發佈了一個應用程序後纔會遇到這個問題。如果關閉消息框並再次嘗試調試,則不會發生任何事情。 MS Help說要完全脫離Visual Studio並重新啓動它。它更容易調出任務管理器並結束該過程。其名稱將是解決方案名稱,後跟「.vshost」(例如,項目名稱:PLC.sln;進程名稱:PLC.vshost.exe)。該過程將自動重啓。在Windows 7中,通常可以在結束進程時看到某些事情發生。但在10中,任務管理器窗口很少改變。 我在更改代碼後嘗試測試程序時收到此消息。顯然,當停止調試時,.exe不會關閉,並且當VS嘗試寫入新編譯的exe文件時發生錯誤。我有時必須結束這個過程兩次,以防止錯誤消息回來。 (我必須遇到錯誤兩次;結束這個過程兩次,然後重新運行沒有幫助。) 這是Visual Studio中的一個錯誤。

+0

嘗試格式化您的答案。很難閱讀這麼大的一段文字 – martianwars 2016-12-06 17:13:21