问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

编程实现寻找硬盘分区

发布网友 发布时间: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~~~!!!
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
为什么我更新了win7QQ拼音在游戏上(剑侠情缘2)不能打字?打出来的都是... 游漓江的船票在哪里买最方便?如何去 因为我想看剑侠情缘,又不想下载什么PPS啊,QQ直播之类软件, 最好是类似... ...两部手机下载相同的手游剑侠情缘却是不一样的都是在QQ上下载的 教子小书坊:一位外交官父亲给孩子的家书图书信息 教子小书坊:一位外交官父亲给孩子的家书内容简介 高二孩子和家长逆反如何教育 高二孩子和家长逆反怎么办 叛逆期孩子怎么教育沟通叛逆期孩子如何教育沟通 请问用otg连接鼠标和键盘后怎么玩手机上的全民枪战,求教程。带图的给... 去邮局寄包裹的步骤是怎么样?我没去做.不好意思问下大家 扬州邗江中学初中部在扬州排第几?? 用C#语言——在form1中有一个按钮,实现点击这个按钮能够修改嵌在form1中的form2上的textbox的enabled属性 扬大附中和邗江中学哪个更好? 江苏邗江中学高中好不好 在哪里 是不是和初中部在一块 华为手机GT_L000充电慢怎么办 第一第二第三第四第五第六第十二第二十第21第23英语方法怎么读 猴头菇炒西芹的做法,猴头菇炒西芹怎么做好吃 横易物联网显示剩余63天是什么意思? 以前百度地图有深圳全景的,现在怎么没有了呢? 江苏宝汇易物物联网科技有限公司怎么样? 列车dcs是什么意思 手机怎么下载DCSworld 游戏呀? DCS PIC IMG等 都是分别用什么手机或相机拍出来的? 我把钥匙忘在了房间里怎么办啊 化工厂DCS人员可以玩手机看电视吗 压力的坏处和好处有哪些? 松塔开花什么样?松树开花后结出的果实是松塔吗? 蜗居:海藻结局这么悲惨,谁才是罪魁祸首? 什么松塔都有松子吗 坏处和好处的对比举几个例子? 扬州邗江中学在扬州怎么样?大概排第几? c++。。。关于函数的编程???急!!! 请问各位大神用c++怎么访问图片的像素点并做修改呢(急用!跪求真解!!!) 邗江中学的新校长是谁 C#应用程序中,怎么控制系统音量 求java记事本教程 江苏省邗江中学的邗中铭 UPS电源什么价格才是真的? 扬州邗江中学对扬州树人中学中考有指标生吗? 江苏邗江中学 扬州的邗江中学好还是扬大附中好?具体说明! 请问江都国际中学初中和邗江中学初中哪个好 邗江中学和扬州树人中学哪个学校的升学率高 小孩上初中 上哪所中学好? 江苏邗江中学的校歌 跪求扬州邗江中学的校歌~ “我的电脑”中“计算机”在哪里? 蓝龙贼到底是什么强度 炉石传说里的奇迹贼、刀油贼和蓝龙贼有什么区别吗?他们不都是一回合带走对手吗,个人感却没啥区 为什么蓝龙贼一般不带奥术巨人 狂野蓝龙贼要怎么打啊,听说好打宇宙牧就组了