Tôi muốn liệt kê tất cả các ký tự ổ đĩa có sẵn (chưa được sử dụng) trong Windows bằng VC++.Liệt kê tất cả các ký tự ổ đĩa có sẵn trong Windows
Tôi làm cách nào để thực hiện việc này?
Tôi muốn liệt kê tất cả các ký tự ổ đĩa có sẵn (chưa được sử dụng) trong Windows bằng VC++.Liệt kê tất cả các ký tự ổ đĩa có sẵn trong Windows
Tôi làm cách nào để thực hiện việc này?
::GetLogicalDrives() trả về danh sách các ổ đĩa sẵn có (đã đọc: đã sử dụng) dưới dạng bit trong mặt nạ. Điều này nên bao gồm các ổ đĩa mạng được ánh xạ. Vì vậy, bạn có thể chỉ cần đi bộ các bit để tìm các bit bằng 0, nghĩa là không có ổ đĩa nào. Nếu nghi ngờ, bạn luôn có thể gọi ::GetDriveType() với ký tự ổ đĩa + ":\"
(":\\"
trong mã C hoặc _T(":\\")
trong thuật ngữ nhận thức Unicode), và điều đó sẽ trả lại DRIVE_UNKNOWN
hoặc DRIVE_NO_ROOT_DIR
nếu ổ đĩa khả dụng.
GetLogicalDriveStrings Function là điểm khởi đầu tốt.
GetLogicalDriveStrings
có thể chỉ cho bạn danh sách các ký tự ổ đĩa hiện được sử dụng.
GetVolumeInformation
có thể được sử dụng để biết thêm thông tin về một ổ đĩa cụ thể.
GetLogicalDrives và GetLogicalDriveStrings không nhìn thấy ổ đĩa mạng được tạo trong một không gian tên khác.
Ví dụ gọi các chức năng từ một dịch vụ đang chạy trong Hệ thống cục bộ sẽ không thấy ổ đĩa mạng được tạo bởi người dùng đã đăng nhập.
Điều này đang xảy ra bắt đầu với Windows XP. Bài viết sau đây mô tả trường hợp này: http://msdn.microsoft.com/en-us/library/windows/desktop/aa363908(v=vs.85).aspx
Tại sao điều đó lại quan trọng? Bạn có thể sử dụng lại các ký tự ổ đĩa bất kể người dùng khác đã định nghĩa chúng, và câu hỏi chỉ cần sử dụng các chữ cái không sử dụng được. – SilverbackNet
Im không shure làm thế nào để liệt kê chúng hoặc nếu nó sẽ biên dịch trên visual C++ nhưng tôi Sturm mã này trên Dev C++ hoặc Mã Blocks để kiểm tra những gì ổ đĩa là acessible bằng cách sử dụng CreateFile và loại ổ đĩa là gì bằng cách sử dụng GetDriveType. Chương trình kiểm tra các ổ đĩa từ A đến Z:
#include <windows.h>
#include <cstring>
#include <sstream>
#include <iostream>
using namespace std;
int __stdcall WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, INT nShowCmd)
{
HANDLE hDevice = NULL;
HANDLE fileFind = NULL;
while(true)
{
Sleep(3005);
char drv='A';
while(drv!='[')
{
Sleep(105);
const char *charDrvCF;
const char *charDrv;
stringstream Str;
string drvStr;
Str<<drv;
Str>>drvStr;
string drvSpc=drvStr+":\\";
string fCheck="\\\\.\\";
string fhCheck=fCheck+drvStr+":";
charDrvCF=fhCheck.c_str();
charDrv=drvSpc.c_str();
hDevice=CreateFile(charDrvCF,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
if(hDevice!=INVALID_HANDLE_VALUE)
{
switch(GetDriveType(charDrv))
{
case DRIVE_FIXED:
{
cout<<"Fixed drive detected: "<<charDrv<<endl;
break;
}
case DRIVE_REMOVABLE:
{
cout<<"Removable drive detected: "<<charDrv<<endl;
break;
}
case DRIVE_NO_ROOT_DIR:
{
cout<<"There is no volume mounted at the specified path. "<<charDrv<<endl;
break;
}
case DRIVE_REMOTE:
{
cout<<"The drive is a remote (network) drive. "<<charDrv<<endl;
break;
}
case DRIVE_CDROM:
{
cout<<"The drive is a CD-ROM drive. "<<charDrv<<endl;
break;
}
case DRIVE_RAMDISK:
{
cout<<"The drive is a RAM disk. "<<charDrv<<endl;
break;
}
case DRIVE_UNKNOWN:
{
cout<<"The drive type cannot be determined. "<<charDrv<<endl;
break;
}
}
}
drv++;
}
}
}
quá nhiều mã lol – TheRealChx101
có, điều đó dễ hơn GetLogicalDriveStrings! – Alnitak