编程实现寻找硬盘分区
发布网友
发布时间:2022-05-16 19:47
我来回答
共6个回答
热心网友
时间:2023-12-17 15:59
马甲吧~你~楼上那位
我用的GNU不能编译这个程序
所以没编译就拿过来
我不废话 有错就去改 没什么大不了的
可能是最初理解的不太好 lz只是想得到驱动器列表的话 参考
http://www.vckbase.com/document/viewdoc/?id=332
下面的代码比较老是实现读取分区信息的 需要改造 主要是bios.h的更新 其中_bios_disk()需要使用新的int biosdisk(int cmd,int driver,int head,int track,int sector,int nsets,void *buf)替换 我这里不能编译带有dos.h的c程序
还有追加结构体定义 其实是这个程序里的bios.h比较老 lz的应该比较新
struct diskinfo_t
{
unsigned drive, head, track, sector, nsectors;
/* void __far *buffer;*/
};
对应的bios.h参考
http://www.dreamincode.net/forums/showtopic20831.htm
能做的就这么多的
#include <stdio.h>
#include <dos.h>
#include <bios.h>
struct direct {
char name[10];
unsigned char mode;
char reserved[10];
struct stamp {
unsigned int mtime;
unsigned int mdate;
} stamp;
unsigned int first;
unsigned long fsize;
};
struct param {
short int sysid[9];
int bytes_sector;
short int sectors_cluster;
int sectors_reserved;
short int total_fats;
unsigned int root_entries;
int total_sectors;
short int media_descriptor;
int sectors_fat;
int sectors_track;
int number_heads;
int hidden_sectors;
};
struct param *bbp();
main(argc,argv)
int argc;
char **argv;
{
int i, j, retry, strt;
unsigned ch, status = 0;
char buf[512];
void far *pbuf;
struct diskinfo_t info;
struct direct *d;
struct param *p;
memset(buf,'\0', sizeof (buf));
pbuf = (void far *)(&buf[0]);
info.buffer = pbuf;
info.drive = (argc > 1) ? atoi(argv[1]) : 0;
info.head = 0;
info.track = 0;
info.sector = 1;
info.nsectors = 1;
for (retry = 0; retry <= 3; retry++) {
if ((status = _bios_disk(_DISK_READ, &info)) == info.nsectors) {
printf("read OK: sizeof direct=%d\n", sizeof (struct direct));
printf("read OK: sizeof params=%d\n", sizeof (struct param));
/*
d = (struct direct *)buf;
for (i = 0; i < 10; i++) {
printf("[%11.11s] first=%x size=%d\n", d->name, d->first, d->fsize);
++d;
}
*/
p = (struct param *)bbp(pbuf);
printf(" sysid=%8.8s\n", p->sysid);
printf(" bytes_sector=%d\n", p->bytes_sector);
printf(" sectors_cluster=%d\n", p->sectors_cluster);
printf("sectors_reserved=%d\n", p->sectors_reserved);
printf(" total_fats=%d\n", p->total_fats);
printf(" root_entries=%u\n", p->root_entries);
printf(" total_sectors=%d\n", p->total_sectors);
printf("media_descriptor=%x\n", p->media_descriptor);
printf(" sectors_fat=%d\n", p->sectors_fat);
printf(" sectors_track=%d\n", p->sectors_track);
printf(" number_heads=%d\n", p->number_heads);
printf(" hidden_sectors=%d\n", p->hidden_sectors);
exit(0);
}
}
}
struct param *
bbp(p)
char far *p;
{
static struct param d;
strncpy(d.sysid,&p[0x3],8);
d.bytes_sector = (int )p[0xb];
d.sectors_cluster = (short int )p[0xd];
d.sectors_reserved = (int )p[0xe];
d.total_fats = (short int )p[0x10];
d.root_entries = (unsigned int)p[0x11];
d.total_sectors = (int )p[0x13];
d.media_descriptor = (short int )p[0x15];
d.sectors_fat = (int )p[0x16];
d.sectors_track = (int )p[0x18];
d.number_heads = (int )p[0x1a];
d.hidden_sectors = (int )p[0x1c];
return (&d);
}
热心网友
时间:2023-12-17 15:59
我不太了解TC环境,不知它能否调用API函数,假如可以的话,有这么几个函数可以用来实现楼主所说的功能(参数省略):
1.GetLogicalDriveStrings(...)可以获取所有驱动器的字符串,得到的字符串类似于c\:<null>d:\<null>......
2.GetDriveType(...)可以得到一个指定的驱动器的类型,其返回值可以是:
DRIVE_UNKNOWN 未知驱动器类型
DRIVE_NO_ROOT_DIR 驱动器不存在
DRIVE_REMOVABLE 可删除.
DRIVE_FIXED 不可删除
DRIVE_REMOTE 远程驱动器
DRIVE_CDROM 光驱
DRIVE_RAMDISK 其他只读性磁盘
基本就是这两个就可以了吧。
这两个函数在头文件winbase.h里。
据说还可以用汇编从磁道扇区上找,这个不太清楚。
详见MSDN
热心网友
时间:2023-12-17 16:00
VC版本的:)
#include <stdio.h>
#include <windows.h>
#include <string.h>
#include <tchar.h>
int main()
{
TCHAR buf[100];
DWORD len;
TCHAR strDriver[100];
UINT uDriveType;
TCHAR* str;
len = GetLogicalDriveStrings( sizeof(buf)/sizeof(TCHAR), buf );
_tprintf( _T("Logical Drives:\n") );
for ( str=buf; *str; str+=_tcslen(str)+1 ) {
memset( strDriver, 0, sizeof( strDriver ) );
_tcscpy( strDriver, str );
uDriveType = GetDriveType( strDriver );
_tprintf( _T("driver %s : "), strDriver );
switch ( uDriveType ) {
case DRIVE_REMOVABLE:
_tprintf( _T("floppy drive or removable hard disk\n") );
break;
case DRIVE_FIXED:
_tprintf( _T("fixed hard drive\n") );
break;
case DRIVE_REMOTE:
_tprintf( _T("remote (network) drive\n") );
break;
case DRIVE_CDROM:
_tprintf( _T("CD-ROM drive\n") );
break;
case DRIVE_RAMDISK:
_tprintf( _T("RAM disk\n") );
break;
default:
_tprintf( _T("drive type cannot be determined\n") );
break;
}
}
return 0;
}
热心网友
时间:2023-12-17 16:00
#include "windows.h"
#include "stdio.h"
main()
{ system("dir");
getchar();
}
这个最简单了,如果不行就用这个,呵呵
#include <windows.h>
#include <stdio.h>
BOOL IsRoot(LPCTSTR lpszPath)
{
TCHAR szRoot[4];
wsprintf(szRoot, "%c:\\", lpszPath[0]);
return (lstrcmp(szRoot, lpszPath) == 0);
}
void FindInAll(::LPCTSTR lpszPath)
{TCHAR szFind[MAX_PATH];
lstrcpy(szFind, lpszPath);
if (!IsRoot(szFind))
lstrcat(szFind, "\\");
lstrcat(szFind, "*.*"); // 找所有文件
WIN32_FIND_DATA wfd;
HANDLE hFind = FindFirstFile(szFind, &wfd);
if (hFind == INVALID_HANDLE_VALUE) // 如果没有找到或查找失败
return;
do
{
if (wfd.cFileName[0] == '.')
continue; // 过滤这两个目录
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
TCHAR szFile[MAX_PATH];
if (IsRoot(lpszPath))
wsprintf(szFile, "%s%s", lpszPath, wfd.cFileName);
else
wsprintf(szFile, "%s\\%s", lpszPath, wfd.cFileName);
FindInAll(szFile); // 如果找到的是目录,则进入此目录进行递归
}
else
{
TCHAR szFile[MAX_PATH];
if (IsRoot(lpszPath))
wsprintf(szFile, "%s%s", lpszPath, wfd.cFileName);
else
wsprintf(szFile, "%s\\%s", lpszPath, wfd.cFileName);
printf("%s\n",szFile); // 对文件进行操作
}
} while (FindNextFile(hFind, &wfd));
FindClose(hFind); // 关闭查找句柄
}
void main(void)
{
FindInAll("f:"); //搜索F盘
}
肺腑之言,绝非复制
热心网友
时间:2023-12-17 16:01
我十分赞成 芭啦宝贝 的回答方式
授人以鱼,不如授人以渔,楼主你好好考虑一下.
回答问题的最好方式是,启发他,而不是一味的去喂它,要让孩子自己学会吃,而不是总去拿着勺子往他嘴里塞哦!
还有,虽然我不懂得编程,但是也知道,API是操作系统提供给程序语言使用的函数,如果没有系统提供的API,,,,没有操作系统的支持,别说C有库,就是C有天天爷也不好使!!更别告诉我C可是用来编写操作系统的,那样只能让人觉得你很幼稚,呵呵,如果你单是为了看看本大爷的电脑上有几个盘符,而自己去写个操作系统的话,,不是我笑话你写不出来,而是笑话你这人可真能南辕北辙,本末倒置!!!
听懂了么,编了好几年程序的那位????
回答完毕! 虽然一句代码没有,但是重在参与么,是不是,假如楼主悬赏了这么多分,只有零星几个人参与,那多让楼主没面子,呵呵!
热心网友
时间:2023-12-17 16:02
楼上牛人...I服了YOU~~~!!!