2012-01-01 3 views
26

Tôi không tìm kiếm mã lệnh gọi tiện ích dòng lệnh, thao tác này sẽ thực hiện thủ thuật. Tôi thực sự quan tâm để biết các API được sử dụng để tạo ra một đĩa RAM.Tôi có thể tạo đĩa RAM theo cách lập trình như thế nào?

Cảm ơn.

EDIT

Động lực: Tôi có một thư viện của bên thứ ba mà hy vọng một tên thư mục để xử lý các tập tin trong thư mục đó theo một cách nhất định. Tôi có những tập tin nén trong một kho lưu trữ. Tôi muốn trích xuất các kho lưu trữ vào một đĩa RAM và vượt qua bên thứ ba đường dẫn đến thư mục tương ứng trên đĩa RAM đó. Như bạn có thể thấy, các tệp ánh xạ bộ nhớ không được sử dụng với tôi.

+1

Nếu bạn thực sự xem xét RAM * đĩa *, không có chức năng 'CreateRAMDisk' nào trong Windows. Tôi nghĩ rằng bạn cần phải xem làm thế nào để tạo ra một trình điều khiển cho một đĩa, nhưng đĩa được chuyển hướng đến RAM. Tuy nhiên, nếu bạn chỉ muốn chuyển hướng các tập tin vào bộ nhớ, thì việc sử dụng tệp ánh xạ bộ nhớ sẽ thực hiện tác vụ. – minjang

+0

Tôi đã chỉnh sửa câu hỏi của mình. – mark

+0

có thể trùng lặp của [API bộ nhớ RAM lập trình cho .NET?] (Http://stackoverflow.com/questions/2402888/programmable-ram-disk-api-for-net) –

Trả lời

1

Không có API để tạo ra một đĩa RAM cho mỗi gia nhập. Bạn cần phải viết trình điều khiển thiết bị của riêng bạn trình bày một đĩa mới vào hệ thống, và làm cho trình điều khiển thiết bị đó làm việc với bộ nhớ được cấp phát.

EDIT (sau khi chỉnh sửa của OP)

Những gì bạn đang cố gắng làm thường được thực hiện bằng cách sử dụng thư mục 'tạm thời', mà là vụ phải cư trú trên đĩa nhanh nhất có sẵn trong hệ thống. Vì vậy, một hệ thống đã có RAMdisk có thể sẽ có biến môi trường tạm thời của nó đã được thiết lập để trỏ tới một thư mục trên RAMdisk, và các hệ thống không có RAMdisk chỉ đơn giản là lấy hình phạt hiệu năng, đó là vấn đề của họ.

Bây giờ, nếu vì lý do nào đó bạn không thể dựa vào sự hiện diện của RAM trên hệ thống, và bạn hoàn toàn cần có hiệu suất nhanh nhất có thể, sau đó tôi thấy không có tùy chọn nào khác ngoài cài đặt bên thứ ba ngay cả mã nguồn mở) đĩa RAM, sử dụng nó tạm thời, và sau đó gỡ bỏ cài đặt nó. Nhưng điều đó rất vụng về.

+11

"viết trình điều khiển thiết bị của riêng bạn" là đồng nghĩa với "hầu như không thể" trong quan điểm của tôi ... – mark

+3

Vâng, tôi nghĩ mọi người trên khắp hành tinh, những người sẽ cảm thấy thoải mái khi thực hiện một nhiệm vụ có thể phù hợp trong một căn phòng. –

+1

Chủ đề này tồn tại trong bao lâu? Phục hồi RAMd -> SSD .. – Karel

6

bạn didnt đề cập đến ngôn ngữ, vì vậy câu trả lời của tôi là trong C#:

Một tập tin bộ nhớ ánh xạ chứa các nội dung của một tập tin trong bộ nhớ ảo. Ánh xạ giữa một tệp và không gian bộ nhớ cho phép một ứng dụng, bao gồm nhiều quy trình, để sửa đổi tệp bằng cách đọc và ghi trực tiếp vào bộ nhớ. Bắt đầu với .NET Framework phiên bản 4, bạn có thể sử dụng mã được quản lý để truy cập các tệp ánh xạ bộ nhớ giống như cách các hàm Windows bản địa truy cập các tệp ánh xạ bộ nhớ, như được mô tả trong Quản lý các tệp ánh xạ bộ nhớ trong Win32 trong thư viện MSDN.

http://msdn.microsoft.com/en-us/library/dd997372.aspx

MemoryMappedFile MemoryMapped = MemoryMappedFile.CreateOrOpen(
     new FileStream(@"C:\temp\Map.mp", FileMode.Create), // Any stream will do it  
     "MyMemMapFile",          // Name 
     1024 * 1024,          // Size in bytes 
     MemoryMappedFileAccess.ReadWrite);     // Access type 

// Tạo giao diện bản đồ và đọc nó:

using (MemoryMappedViewAccessor FileMap = MemoryMapped.CreateViewAccessor()) 
{ 
     Container NewContainer = new Container(); 
     FileMap.Read<Container>(4, out NewContainer); 
} 
+9

Đó là tệp bộ nhớ ánh xạ. Nó không phải là một đĩa RAM. –

+0

@MikeNakis có 'tệp được ánh xạ bộ nhớ không tồn tại' và' tệp được ánh xạ bộ nhớ tạm thời' http: // msdn.microsoft.com/en-us/library/dd997372.aspx –

+0

@MikeNakis 'Các tệp không tồn tại là các tệp ánh xạ bộ nhớ không được liên kết với tệp trên đĩa.' –

27

ImDisk là một ứng dụng đĩa RAM tạo ổ đĩa ảo từ một khu vực bộ nhớ và có API có thể được gọi từ .NET.

class RamDisk 
{ 
    public const string MountPoint = "X:"; 

    public void createRamDisk() 
    { 

     try 
     { 
      string initializeDisk = "imdisk -a "; 
      string imdiskSize  = "-s 1024M "; 
      string mountPoint  = "-m "+ MountPoint + " "; 


      ProcessStartInfo procStartInfo = new ProcessStartInfo(); 
      procStartInfo.UseShellExecute = false; 
      procStartInfo.CreateNoWindow = true; 
      procStartInfo.FileName   = "cmd"; 
      procStartInfo.Arguments   = "/C " + initializeDisk + imdiskSize + mountPoint; 
      Process.Start(procStartInfo); 

      formatRAMDisk(); 

     } 
     catch (Exception objException) 
     { 
      Console.WriteLine("There was an Error, while trying to create a ramdisk! Do you have imdisk installed?"); 
      Console.WriteLine(objException); 
     } 

    } 

    /** 
    * since the format option with imdisk doesn't seem to work 
    * use the fomat X: command via cmd 
    * 
    * as I would say in german: 
    * "Von hinten durch die Brust ins Auge" 
    * **/ 
    private void formatRAMDisk(){ 

     string cmdFormatHDD = "format " + MountPoint + "/Q /FS:NTFS"; 

     SecureString password = new SecureString(); 
     password.AppendChar('0'); 
     password.AppendChar('8'); 
     password.AppendChar('1'); 
     password.AppendChar('5'); 

     ProcessStartInfo formatRAMDiskProcess = new ProcessStartInfo(); 
     formatRAMDiskProcess.UseShellExecute = false; 
     formatRAMDiskProcess.CreateNoWindow  = true; 
     formatRAMDiskProcess.RedirectStandardInput  = true; 
     formatRAMDiskProcess.FileName   = "cmd"; 
     formatRAMDiskProcess.Verb    = "runas"; 
     formatRAMDiskProcess.UserName   = "Administrator"; 
     formatRAMDiskProcess.Password   = password; 
     formatRAMDiskProcess.Arguments   = "/C " + cmdFormatHDD; 
     Process process       = Process.Start(formatRAMDiskProcess); 

     sendCMDInput(process); 
    } 

    private void sendCMDInput(Process process) 
    { 
     StreamWriter inputWriter = process.StandardInput; 
     inputWriter.WriteLine("J"); 
     inputWriter.Flush(); 
     inputWriter.WriteLine("RAMDisk for valueable data"); 
     inputWriter.Flush(); 
    } 

    public string getMountPoint() 
    { 
     return MountPoint; 
    } 
} 
+0

Công cụ tuyệt vời! –

+3

Đã thử cả 'IMDisk' và' SoftPerfect RAM DIsk', tôi thích 'SoftPerfect's'. Nó có hiệu suất tốt hơn, chỉ được dành riêng 0,2 MB trong số 100 MB được phân bổ, so với 10 MB cho' IMDisk' và không yêu cầu 'Người dùng Kiểm soát tài khoản (UAC) 'nhắc để gắn ổ đĩa. Cả hai đều hỗ trợ một tùy chọn liên tục, nhưng tôi đã thử nghiệm điều đó. – Loathing