2010-09-20 59 views
23

làm cách nào tôi có thể tạo Ổ đĩa cứng ảo (như Z :) lưu trữ tệp của nó trên ổ cứng vật lý (Giống như C: \ Files).tạo ổ cứng ảo

+1

Bằng cách viết một trình điều khiển thiết bị. Một cái gì đó bạn không thể làm với C#. – dtb

+0

Không phải chuyên gia nhưng có vẻ như bạn cần phải làm việc ở cấp hạt nhân với DDK. – LatinSuD

+2

@dtv & LatinSuD, điều này chắc chắn không yêu cầu tạo hệ thống tệp ảo, bạn có thể dễ dàng ánh xạ ổ đĩa đến đường dẫn cục bộ. – mikerobi

Trả lời

42

Dưới đây là mã C# để làm điều này trực tiếp: sử dụng

using System; 
using System.Text; 
using System.ComponentModel; 
using System.Runtime.InteropServices; 

static class Subst { 
    public static void MapDrive(char letter, string path) { 
     if (!DefineDosDevice(0, devName(letter), path)) 
      throw new Win32Exception(); 
    } 
    public static void UnmapDrive(char letter) { 
     if (!DefineDosDevice(2, devName(letter), null)) 
      throw new Win32Exception(); 
    } 
    public static string GetDriveMapping(char letter) { 
     var sb = new StringBuilder(259); 
     if (QueryDosDevice(devName(letter), sb, sb.Capacity) == 0) { 
      // Return empty string if the drive is not mapped 
      int err = Marshal.GetLastWin32Error(); 
      if (err == 2) return ""; 
      throw new Win32Exception(); 
     } 
     return sb.ToString().Substring(4); 
    } 


    private static string devName(char letter) { 
     return new string(char.ToUpper(letter), 1) + ":"; 
    } 
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern bool DefineDosDevice(int flags, string devname, string path); 
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
    private static extern int QueryDosDevice(string devname, StringBuilder buffer, int bufSize); 
} 

mẫu:

 Subst.MapDrive('z', @"c:\temp"); 
     Console.WriteLine(Subst.GetDriveMapping('z')); 
     Subst.UnmapDrive('z'); 
+0

có hoạt động trong cửa sổ 10 không? không thể làm cho nó hoạt động – Kubi

+0

Nếu người dùng vượt qua ký tự ổ đĩa cứng, 'sb' sẽ chứa một cái gì đó như' \ Device \ HarddiskVolume2' và 'Substring (4)' về cơ bản sẽ trả về rác. Tôi khuyên bạn nên đảm bảo 'sb' bắt đầu bằng' @ "\ ?? \" 'trước khi trả về' Chuỗi con (4) '. Nếu nó bắt đầu với một cái gì đó khác, '" "' (cùng một điều bạn trở lại nếu ổ đĩa không tồn tại ở tất cả) có vẻ như một giá trị hợp lý để trở về - không có ổ đĩa SUBSTed để có được con đường của. –

+0

@Hans Passant: mã trên sẽ không hiển thị bất kỳ hiệu ứng nào khi ứng dụng chạy dưới quyền quản trị viên. tức là 'Run As Admin' đã thử nó trong windows 8 và windows 10, tuy nhiên, nếu không có quyền admin thì mã sẽ hiển thị kết quả mong đợi, một câu hỏi được đăng liên quan đến chủ đề ở đây, đánh giá cao nếu bạn xem https: // stackoverflow .com/q/46663368/323339 –

10

Bạn có thể sử dụng lệnh subst. Sử dụng System.Diagnostic.Process để chạy subst.exe với các tham số mong muốn.

Đây là cú pháp lệnh:

Cú pháp

Associates một con đường với một ký tự ổ đĩa.

SUBST [drive1: [drive2:]path] 
SUBST drive1: /D 

drive1: Chỉ định ổ đĩa ảo đến mà bạn muốn chỉ định đường dẫn.

Đường dẫn [drive2:] Chỉ định ổ đĩa vật lý và đường dẫn bạn muốn gán cho ổ đĩa ảo .

/D Xóa ổ đĩa thay thế (ảo).

Nhập SUBST không có tham số để hiển thị danh sách ổ đĩa ảo hiện tại.list của các ổ đĩa ảo hiện tại.

+1

Để bạn biết, điều này có thể là một trong những phương pháp dễ nhất. Tuy nhiên, khởi động lại máy tính sẽ hoàn nguyên việc gắn kết và loại bỏ ổ đĩa ảo và đặt mọi thứ trở lại bình thường. Nếu bạn thêm mục nhập vào tệp autoexec.bat, ổ đĩa ảo có thể được giữ lại trong suốt quá trình khởi động lại. –

+0

@Ranhiru, bạn nói đúng, ổ đĩa ảo sẽ được hoàn nguyên trên mỗi lần khởi động. Một giải pháp dễ dàng là chương trình sẽ gọi lệnh subst bất cứ khi nào nó bắt đầu. –

+0

Trong Windows 7/64, cách tốt nhất để thực hiện "subst" vĩnh viễn sẽ được tất cả các quy trình xem là gì? – supercat

1

Thực hiện theo cùng cách bạn sẽ ánh xạ ổ đĩa mạng, nhưng trỏ nó vào một thư mục trên máy hiện tại. Điều duy nhất bạn phải làm đặc biệt là sử dụng đường dẫn UNC cho thư mục cục bộ.

Đây là một helper class

-1

Không chắc làm thế nào để làm điều này trong C# nhưng điều này sẽ giúp bạn:

Ive chỉ được thử nghiệm này và hoạt động hoàn hảo

Trên máy tính của tôi có 1 ổ cứng phát minh ra vào 2, C: & D:, đi vào D: tôi có thư mục có tên Sao lưu, nếu bạn nhấp chuột phải vào thư mục và nhấp vào tab Share, bạn sẽ thấy Network Path .. Trên máy của tôi có vẻ như \\Robert-home\backup

sau đó tôi tiến hành CMD và thực hiện lệnh sau

NET USE Z: \\Robert-home\backup 

Witch bản đồ thành công các nội dung của D:\backup để Z:

Im chắc chắn rằng bạn có thể hoàn thành như một nhiệm vụ trong C# ..

Tôi thường sử dụng phương pháp này tại nơi làm việc để hỗ trợ khách hàng để chuyển và sao lưu các tập tin trước khi bàn giao tiếp mới được cấp cho chúng.

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