2012-09-14 31 views
8

Vì câu hỏi ban đầu của tôi hơi quá mơ hồ, hãy để tôi làm rõ.Không gian trống trên đĩa DVD/blu-ray trống (IMAPI)

Mục tiêu của tôi là:

  1. để ước tính kích thước đĩa trống sau khi chọn hệ thống tập tin qua IMAPI
  2. để ước lượng không gian mà tập tin của tôi sẽ tiêu thụ trên đĩa này nếu tôi ghi nó.

Những gì tôi muốn biết:

  1. Có thể để có được byte cho mỗi ngành cho hệ thống tập tin được lựa chọn lập trình
  2. Nếu không, là có giá trị mặc định cho byte cho mỗi ngành mà IMAPI sử dụng cho các hệ thống tệp/loại phương tiện khác nhau và được ghi lại ở đâu đó.
+2

Tại sao không phải là WMI một lựa chọn? – PhonicUK

+0

@ S.L. Barth, tôi không nghĩ vậy. –

+0

@PhonicUK, kinh nghiệm quá khứ :) Tôi sẽ sử dụng nó, nếu không có cách nào khác. Tôi đã hy vọng có được những giá trị đó thông qua IMAPI, tbh. –

Trả lời

4

Ok, vậy câu trả lời ngắn cho câu hỏi của tôi là: người ta có thể SAF giả sử rằng, kích thước sector cho đĩa DVD/BD = 2048 byte.

Lý do, lý do tại sao tôi đã nhận được các kích cỡ khác nhau trong phiên debug của tôi, là do một lỗi trong mã, trong đó lấy lĩnh vực đếm :)

khối mã đề cập được copypasted từ http://www.codeproject.com/Articles/24544/Burning-and-Erasing-CD-DVD-Blu-ray-Media-with-C-an, vì vậy chỉ trong trường hợp im gửi bài một sửa chữa nhanh chóng.

mã ban đầu:

discFormatData = new MsftDiscFormat2Data(); 
discFormatData.Recorder = discRecorder; 
IMAPI_MEDIA_PHYSICAL_TYPE mediaType = discFormatData.CurrentPhysicalMediaType; 
fileSystemImage = new MsftFileSystemImage(); 
fileSystemImage.ChooseImageDefaultsForMediaType(mediaType); 
if (!discFormatData.MediaHeuristicallyBlank) 
{ 
    fileSystemImage.MultisessionInterfaces = discFormatData.MultisessionInterfaces; 
    fileSystemImage.ImportFileSystem(); 
} 
Int64 freeMediaBlocks = fileSystemImage.FreeMediaBlocks; 

đang cố định:

discFormatData = new MsftDiscFormat2Data { Recorder = discRecorder }; 
fileSystemImage = new MsftFileSystemImage(); 
fileSystemImage.ChooseImageDefaults(discRecorder); 
if (!discFormatData.MediaHeuristicallyBlank) 
{ 
    fileSystemImage.MultisessionInterfaces = discFormatData.MultisessionInterfaces; 
    fileSystemImage.ImportFileSystem(); 
} 
Int64 freeMediaBlocks = fileSystemImage.FreeMediaBlocks; 
0

Nếu bạn biết khối miễn phí/đã sử dụng và tổng dung lượng lưu trữ (bỏ qua dung lượng đã sử dụng/rảnh) thì bạn có thể tính kích thước cho mỗi khối và sau đó làm việc.

block size = total size/(blocks used + blocks free) 
free space = size per block * blocks free 

Tôi sẽ ngạc nhiên nếu bạn thấy kích thước khối là bất cứ điều gì khác hơn 1K dù

+0

Nhưng vấn đề là - tôi không biết tổng kích thước. Đó là lý do tại sao tôi cần kích thước khu vực. Vì vậy, tôi có thể nhân nó theo lĩnh vực đếm và nhận được miễn phí/sử dụng/tổng không gian trong byte. Ít nhất đó là những gì tôi đã đưa ra với> _> –

+0

Và không, nó không phải 1k. Tôi đã sửa lỗi ứng dụng của mình với nhiều loại phương tiện khác nhau và kích thước khối thay đổi từ 2048 đến 4096 (tôi đã tính toán kích thước theo cách thủ công bằng cách xem tổng kích thước, được hiển thị trong cửa sổ thám hiểm) –

+0

Chỉ cần sử dụng một ví dụ 'DriveInfo' để có cùng kích thước được hiển thị trong trình khám phá làm phép tính. - http://msdn.microsoft.com/en-us/library/system.io.driveinfo.aspx – PhonicUK

0

qua IMAPI - IWriteEngine2 :: get_BytesPerSector

http://msdn.microsoft.com/en-us/library/windows/desktop/aa832661(v=vs.85).aspx

dự án này sử dụng một IMAPI2 quản lý wrapper để làm cho cuộc sống dễ dàng hơn - http://www.codeproject.com/Articles/24544/Burning-and-Erasing-CD-DVD-Blu-ray-Media-with-C-an

+0

oh, tôi đã bỏ lỡ giao diện này hoàn toàn: S Ngay sau khi tôi có cơ hội tôi sẽ cố gắng tìm ra cách làm việc với nó và báo cáo kết quả. Cười. Tuy nhiên, nếu some1 có thể chia sẻ một mẫu mã - điều đó sẽ thực sự tốt đẹp. –

+0

như đã nêu trên msdn: "Lấy số byte để sử dụng cho từng sector trong khi viết. Giá trị trả về cho biết giá trị được đặt trước đó với IWriteEngine2 :: put_BytesPerSector và không trả lại byte hiện tại cho mỗi giá trị sector cho phương tiện." Vì vậy, tài sản này phục vụ mục đích khác nhau. –

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