2010-02-08 31 views
15

Tôi nhận dữ liệu nhị phân từ trường cơ sở dữ liệu SQL Server và đang tạo tài liệu cục bộ trong thư mục mà ứng dụng của tôi có quyền. Tuy nhiên tôi vẫn nhận được lỗi được chỉ định trong tiêu đề. Tôi đã thử nhiều đề xuất được đăng trên web bao gồm những đề xuất trong các bài đăng trước trên Stackoverflow. Tôi cũng đã sử dụng ProcessExplorer> Find Handle để xác định vị trí khóa và nó sẽ trả về không có gì giống như tập tin không bị khóa.Quá trình không thể truy cập tệp vì nó đang được sử dụng bởi một quy trình khác

Tôi đang sử dụng mã bên dưới để lưu tệp vào hệ thống tệp và sau đó tôi cố gắng sao chép tệp này sang vị trí mới sau trong quy trình đăng ký trong một phương pháp khác. Đây là phương thức sao chép có đường dẫn của tệp mới được tạo ra để ném ngoại lệ.

Bản thân tệp được tạo bằng nội dung của nó và tôi có thể mở tệp thông qua Windows Explorer mà không gặp bất kỳ sự cố nào.

Tôi có thiếu điều gì đó hoàn toàn hiển nhiên không? Tôi có tạo đúng tệp từ cơ sở dữ liệu không? Bất kỳ trợ giúp nào về giải quyết hoặc chẩn đoán tốt hơn vấn đề sẽ được đánh giá cao.

// 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

Bạn có đăng mã thực tế không? Có vẻ như có một vấn đề vô hình mà có thể nằm ẩn ở nơi khác ... – Bloodyaugust

+0

Tôi biết bạn có thể chỉ cần thay thế văn bản cho mục đích câu hỏi của bạn, nhưng đường dẫn tệp của bạn phải là '@" C: \ myTempDirectory \ myFile.doc "' vì thoát dấu gạch chéo ngược. – Jacob

+0

Bạn có chắc chắn ngoại lệ không nói về đích Tên tệp đang được sử dụng bởi một quy trình khác không? – Jacob

Trả lời

28

Hãy thử thêm một cuộc gọi đến GC.Collect() sau khi bạn đã vứt bỏ con suối của bạn để buộc bộ thu gom rác phải dọn sạch.

// 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

Cảm ơn rất nhiều, dường như đã thực hiện nó. Tuy nhiên một cái gì đó phải sai ở đâu đó cho nó vẫn giữ nó ngay cả sau khi tôi đã gọi là close(). Ít nhất tôi có thể chuyển sang giai đoạn tiếp theo của vấn đề.Rất cám ơn tất cả mọi người đã giúp tôi nhận được để dưới cùng của nó, nhiều đánh giá cao. Tối nay tôi sẽ ngủ ngon lành :) – Cragly

+12

Ai đó có thể giải thích lý do tại sao các luồng không đóng ngay lập tức trong Dispose()? – Kugel

+5

GC.Collect() => đó là EVIL! – user384080

1

Có phải Filestream và BinaryWriter không thể sử dụng cùng một lúc được không? Ví dụ, một streamwriter và một streamreader không thể được gọi trên cùng một tập tin. Tuy nhiên, điều này không có ý nghĩa, theo như tôi biết, nó không nên trong trường hợp này. Có lẽ thử đóng br là tốt?

1

Hãy thử xử lý đối tượng BinaryWriter của bạn trước khi thực hiện sao chép.

+0

Không có kẻ may mắn. Tôi đã làm một Flush() và một Close() trên BinaryWriter và vẫn nhận được cùng một lỗi. – Cragly

+0

Làm thế nào về một Vứt bỏ, mặc dù? –

1

Có quy trình nền như chống vi-rút hoặc lập chỉ mục tệp hệ thống khóa tệp chỉ đủ dài để gây ra sự cố với ứng dụng của bạn không? Thử tạm dừng trong 3 giây để xem sự cố của bạn có biến mất không.

using System.Threading; 

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

Không! điều tương tự cũng xảy ra. Bắt đầu khiến tôi phát điên ... – Cragly

3

Điều gì về 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); 

EDIT: Cố gắng thông báo cho một sự cho phép FileShare.Read.

+0

Còn về việc sử dụng BinaryWriter thì sao? –

+0

Không làm việc. Thậm chí đã thử nó có và không có nút Close() trên FileStream và BinaryWriter. – Cragly

+1

Thêm 'FileShare.Read' * có vẻ * đã sửa vấn đề * cho tôi * –

4

thay đổi mã của bạn như sau, vấn đề là các FileStream không được thu gom rác thải khi bạn cần nó:

// 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

Không có niềm vui bất hạnh !! Nó phải là một điều đơn giản để làm. Cảm ơn một lần nữa cho tất cả các nỗ lực của bạn guys của nó nhiều đánh giá cao. – Cragly

3

tôi đã hiểu rằng mặc dù các chương trình gỡ rối lỗi nói rằng lỗi nằm trong mã này .. Nhưng đó không phải là lỗi ở đâu .. tôi phải đối mặt với một vấn đề tương tự và tôi đến với giải pháp này. . xem xét tất cả các bài viết ở trên .. có thể là nó có thể giúp một số một ..


tôi đã sử dụng hình ảnh để hiển thị nó trong một picturebox sau retreiving từ cơ sở dữ liệu và lưu nó như là "temp.bmp" sử dụng mã hóa bình thường mà không sử dụng 'sử dụng' từ khóa sử dụng mã này lúc đầu:

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

và nó lớn lên và không bị lỗi và tôi thực sự không có đầu và đuôi của lỗi .. và vì vậy tôi đã đưa ra giải pháp này


Thay vì gán cho nó trực tiếp thử mã này:.

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

đến tập tin dòng phần I chỉ được sử dụng mã bình thường như sau:

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

và nó làm việc giống như một miếng bánh


Nó thực sự giúp

+0

Cảm ơn Murali. Tôi có thể thấy cách đó sẽ làm việc bằng cách gán giá trị cho một đối tượng mới và sau đó gán giá trị đối tượng mà không phải là một phần của câu lệnh using. Cảm ơn bạn đã cập nhật và hy vọng sẽ được sử dụng cho những người khác gặp phải vấn đề tương tự. – Cragly

0

Đây là những gì tôi đã làm:

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

sau đó sử dụng đối tượng stream ở bất cứ đâu bạn muốn.

-1

Tôi dường như chỉ gặp phải điều này sau khi tôi đã xuất bản một ứng dụng. Nếu bạn đóng hộp thư và thử lại để gỡ lỗi, sẽ không có gì xảy ra. MS Trợ giúp nói để có được tất cả các con đường ra khỏi Visual Studio và khởi động lại nó. Dễ dàng hơn trong việc đưa Trình quản lý tác vụ lên và kết thúc quá trình. Tên của nó sẽ là tên giải pháp theo sau là ".vshost" (ví dụ: tên dự án: PLC.sln; tên quy trình: PLC.vshost.exe). Quá trình sẽ tự động khởi động lại. Trong Windows 7 người ta thường có thể thấy một cái gì đó xảy ra khi kết thúc một quá trình. Nhưng trong 10 cửa sổ Task Manager hiếm khi thay đổi. Tôi nhận được thông báo này khi tôi thử kiểm tra một chương trình sau khi thay đổi mã. Rõ ràng .exe không được đóng khi một dừng gỡ lỗi và lỗi xảy ra khi VS cố ghi một tệp exe mới được tuân thủ. Đôi khi tôi phải kết thúc quá trình hai lần để giữ cho thông báo lỗi xuất hiện trở lại. (Tôi phải gặp lỗi hai lần, kết thúc quá trình hai lần và sau đó chạy lại không giúp được.) Đây là lỗi trong Visual Studio.

+0

Hãy thử định dạng câu trả lời của bạn. thật khó để đọc một đoạn văn bản lớn như vậy – martianwars

Các vấn đề liên quan