#include<stdio.h>
#include<string.h>
#include "filesys.h"
/*目录*/
_dir() /* -dir */
{
unsigned short di_mode;//存取权限
int i,j,k,one;
struct inode *temp_inode;
printf("\n目录 大小=%d\n",dir.size);
for(i=0;i<dir.size;i++)
{
if(dir.direct[i].d_ino!=DIEMPTY)//目录没存取权限,则输出当前目录信息
{
printf("%14s ",dir.direct[i].d_name);
printf("d_ino=%d",dir.direct[i].d_ino);
temp_inode=iget(dir.direct[i].d_ino);
di_mode=temp_inode->di_mode;
if(temp_inode->di_mode & DIFILE) printf("f"); //如果是文件打印f
else printf("d");
for(j=0;j<9;j++)
{
one=di_mode%2;
di_mode=di_mode/2;
if(one) printf("x");
else printf("-");
}
if(temp_inode->di_mode & DIFILE) //如果是文件权限,则输出其物理块号
{
printf("%ld",temp_inode->di_size);
printf("数据链:");
for(k=0;k<temp_inode->di_size/BLOCKSIZ+(temp_inode->di_size%BLOCKSIZ != 0);k++)
printf("%d ",temp_inode->di_addr[k]);
printf("\n");
}
else
printf("<dir>数据链:%d\n",dir.direct[i].d_ino);
iput(temp_inode);
}
}
printf("dir---->out\n");
}
mkdir(dirname) /* mkdir */
char *dirname;
{
int dirid,dirpos;
struct inode *inode;
struct direct buf[BLOCKSIZ/(DIRSIZ+2)];
unsigned int block;
dirid=namei(dirname); //返回索引节点号
printf("dirid=%d\n",dirid);
if(dirid != NULL)
{
inode=iget(dirid);
if(inode->di_mode & DIDIR)
printf("\n%s 目录已经存在!!!\n",dirname);
else
printf("\n%s 是文件名,不能建立一个与目录相同的名字\n",dirname);
iput(inode);
return;
}
dirpos=iname(dirname);//找到 一个新节点
inode=ialloc();//分配索引节点
dirid=inode->i_ino;//目录id等于索引节点的节点号
dir.direct[dirpos].d_ino=inode->i_ino;
dir.size++;
/*填充新的目录指针 */
strcpy(buf[0].d_name,".");
buf[0].d_ino=dirid;
strcpy(buf[1].d_name,"..");
buf[1].d_ino=cur_path_inode->i_ino;
buf[2].d_ino=0;
block=balloc();
fseek(fd,DATASTART+block*BLOCKSIZ,SEEK_SET);
fwrite(buf,1,BLOCKSIZ,fd);
inode->di_size=2*(DIRSIZ+2);
inode->di_number=1;
inode->di_mode=user[user_id].u_default_mode;
inode->di_uid=user[user_id].u_uid;
inode->di_gid=user[user_id].u_gid;
inode->di_addr[0]=block;
iput(inode);
printf("mkdir---->out\n");
return ;
}
chdir(dirname) /* chdir */
char *dirname;
{
unsigned int dirid;
struct inode *inode;
unsigned short block;
int i,j,low=0,high=0;
dirid=namei(dirname);
/*printf("\ndirname=%skkkkk,dirid=%d\n",dirname,dirid); */
if(dirid==NULL)
{
printf("\n%s不存在\n",dirname);
return;
}
inode=iget(dirid);
if (inode->di_mode & DIFILE) { // 有存取权限,但是是文件
printf("\n这是文件!不能用这命令!\n");
return;
}
if(!access(user_id,inode,user[user_id].u_default_mode))//用户没有访问权限
{
printf("\n不允许到达这个目录 %s\n",dirname);
iput(inode);
return;
}
if ( !strcmp(dirname, "..") ) {
if ( dir_lv > 1 ) {
cur_path[dir_lv-1][0] = 0;
--dir_lv;
}
}
else if ( !strcmp(dirname, ".") ) { }
else {
if ( dir_lv < 10 ) {
strcpy(cur_path[dir_lv], dirname);
++dir_lv;
}
}
/* 进入当前目录*/
for(i=0;i<dir.size; i++)
{
for(j=0;j<DIRNUM;j++)
if(dir.direct[j].d_ino==0) break;
memcpy(&dir.direct[j],&dir.direct[i],DIRSIZ+2);
dir.direct[j].d_ino=0;
}
/*写回当前的目录*/
for(i=0;i<cur_path_inode->di_size/BLOCKSIZ+(cur_path_inode->di_size%BLOCKSIZ!=0); i++)
{
bfree(cur_path_inode->di_addr[i]);
}
for(i=0;i<dir.size; i+=BLOCKSIZ/(DIRSIZ+2))
{
block=balloc();
cur_path_inode->di_addr[i]=block;
fseek(fd,DATASTART+block*BLOCKSIZ,SEEK_SET);
fwrite(&dir.direct[i],1,BLOCKSIZ,fd);
}
cur_path_inode->di_size=dir.size*(DIRSIZ+2);
iput(cur_path_inode);
cur_path_inode=inode;
dir.size=inode->di_size/(DIRSIZ+2);
/*从磁盘读取改变的目录 */
j=0;
for(i=0;i<inode->di_size/BLOCKSIZ+(inode->di_size%BLOCKSIZ!=0); i++)
{
fseek(fd,DATASTART+inode->di_addr[i]*BLOCKSIZ,SEEK_SET);
fread(&dir.direct[j],1,BLOCKSIZ,fd);
j+=BLOCKSIZ/(DIRSIZ+2);
};
printf("chdir---->out\n");
return;
}
没有合适的资源?快使用搜索试试~ 我知道了~
多用户多目录文件系统设计与实现
共22个文件
c:20个
o:1个
h:1个
需积分: 10 40 下载量 104 浏览量
2016-07-15
09:25:25
上传
评论 6
收藏 20KB RAR 举报
温馨提示
用c开发的文件系统,能完美运行,实现了用户登录,登出,注册的多用户功能,同时实现文件的创建,打开,读,写,关闭,删除等操作。
资源推荐
资源详情
资源评论
收起资源包目录
多用户多目录文件设计与实现.rar (22个子文件)
filesys源代码
iallfre.c 2KB
main.o 5KB
creat.c 2KB
dir.c 5KB
name.c 1023B
install.c 2KB
vi.c 868B
regist.c 1KB
halt.c 874B
close.c 334B
format.c 4KB
dirlt.c 255B
delete.c 1KB
open.c 2KB
iget.c 2KB
cat.c 1KB
log.c 1KB
rdwt.c 4KB
ballfre.c 2KB
access.c 1KB
filesys.h 6KB
main.c 5KB
共 22 条
- 1
资源评论
zimimei
- 粉丝: 0
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 老飞飞搭建基础通用数据库V19数据库.rar
- jquery.js
- 机械设计多工位ACF贴胶带&预压设备sw18可编辑非常好的设计图纸100%好用.zip
- 基于Pytorch复现Point-Transformer,用于ShapeNet数据集点云分割
- 【医学影像分析】2D超声图像的分割检测(Ultrasound Nerve Segmentation - Kaggle数据集)
- 嘎嘎香的五款神仙谷歌插件
- .arch书源导入教程.mp4
- 贪心算法介绍及代码示例讲解
- CR13SP35MSI64 Crystal 水晶报表运行组件最后版本64位
- 图像分类数据集:玉米叶是否感染分类数据集(2分类,包含训练集、验证集)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功