其实,刚拿到这个题目时,我真的没有思路,随后我就对着老师的课设指导书进行研究,对二级文件系统的演示这个课题的每个要求进行分析,总算是有了思路。下面给出我的分析。
文件系统演示
一、课程设计目的
使学生熟悉文件管理系统的设计方法;加深对所学各种文件操作的了解及其操作方法的特点。
//既然是基于控制台的,我们可以更改颜色玩玩
二、课程设计内容
设计一个简单的多用户文件系统。即 //和后面一样,用结构体数组实现
①在系统中用一个文件来模拟一个磁盘; //switch语句或者if-else语句实现,既然这里说到了 用一个文件去模拟一个磁盘,换句话说,在你的课设里,必须要有磁盘空间分配的思路在里面,不然就不是模拟磁盘了。
②此系统至少有:Create、delete、open、close、read、write等和部分文件属性的功能。
③实现这个文件系统。 //文件系统要实现
④能实际演示这个文件系统。//cmd演示即可
基本上是进入一个界面(此界面就是该文件系统的界面)后,可以实现设计的操作要求。

三、课程设计指导
1)设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。 //三个数组的大小分别为 10、10、5
//一次运行用户最多可以打开5个文件如何实现? 在用户文件里面加变量判断,用户每打开一个就+1,
//每次用户最多可保存10个文件如何实现? 很明显,同时保存我们是无法做到的,无论是谁,都无法做到,也就是说还是一个个保存的,那么同样可以设置变量判断。如果保存的较多,那么只好请用户单独关闭某些指定的文件。

2)程序采用二级文件目录(即设置主目录MFD)和用户文件目录(UFD)。另外,为打开文件设置了运行文件目录(AFD)。 //存放各个用户目录的文件夹、用户目录
//是说运行的所有文件用一个目录层次表示吗
3)为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。 //整型的变量判断是否读写完成了 下面的pointer
4)因系统小,文件目录的检索使用了简单的线性搜索。 //链表的顺序查找
5)文件保护简单使用了三位保护码:允许读写执行、对应位为 1,对应位为0,则表示不允许读写、执行。 //标记变量即可实现
6)程序中使用的主要设计结构如下:主文件目录和用户文件目录(MFD、UFD),打开文件目录(AFD)即运行文件目录,如图5.1所示。//主要的结构体设计

还有MFD、UFD、AFD最好全部存到文件里面去,不然每次都要输入,十分麻烦,而且不能通过看文件 查看到自己的实验现象,着实不便。
参考的数据结构设计如下
struct TYPE_UFD //用户文件目录
{
string File_Name; //文件名
bool Read; //读保护码,true为可读
bool Write; //写保护码,true为可写
bool Execute; //执行保护码,true为可执行
int Length_File; //文件长度
}; //用户文件目录和用户打开的文件目录是不是都各有自己的属性
struct TYPE_MFD //主文件目录
{
string User_Name; //用户名
TYPE_UFD *Pointer; //用户文件目录指针
};
//很明显,第三个结构体没有指针域,但我们是需要指针域的,还有下面红色部分可以合在一个整型变量里面的
struct TYPE_AFD //打开文件目录
{
int File_ID; //打开的文件号
boolRead;//读保护码,true为可读
boolWrite;//写保护码,true为可写
boolExecute;//执行保护码,true为可执行
int Pointer; //读写指针
};
7)文件系统结构如图5.2所示
//很明显,这里要用到的数据结构是 链表
    
8)文件系统算法的流程图如图5.3所示。
                            
图5.3文件系统算法的流程图
//这里告诉了你 main函数的主要调用的函数顺序
9)注意对于物理块的访问(包括访问指针,空闲位)需要经过输入输出,相当于通过定位对文件进行读写。打开文件目录(AFD)是在内存中,由打开文件时创建。
好了,分析完了,就要开始编写代码了,下面附上我小小的代码,还有很多需要修改的地方,做的不好的地方,大神就请原谅,也希望多多指点我。
先附上效果图:
                

头文件部分:
#include<cmath>
#include<ctime>
#include<string>
#include<conio.h>
#include<fstream>
#include<cstdlib>
#include<iostream>
#include<windows.h>
using namespace std;typedef struct UFD
{string File_name;         //文件名int Start;                //文件在磁盘存储空间的起始地址int Protect;              //文件的属性int File_length;           //文件的长度int Max_File_length;         //文件的最大长度struct UFD *next;
}UFD,*UFD_ptr;typedef struct MFD
{string User_name;string User_passwd;UFD *Ufd_next;int End;struct MFD *next;
}MFD,*MFD_ptr;typedef struct AFD
{string File_name;int File_length;int Start;int Protect;int Pointer;    //根据这个指针的值去完成用户的要求  读写指针int Max_File_length;struct AFD *next;
}AFD,*AFD_ptr;
源文件部分:
#include"os_fss.h"#define MaxDisk 512*1024   //一个扇区512字节,假设有1024个扇区,模拟磁盘的大小
int Max_User=10;
int Max_Open=5;
int Max_End=0;
UFD_ptr pufd=NULL;
MFD_ptr pmfd=NULL;
AFD_ptr pafd=NULL;
char User_name[30];   //存放当前用户的用户名
char flag='n';
char Disk_Size[MaxDisk];    //最后在打印输出的时候,用RWX表示即可typedef struct Disk_Table
{int Max_length;      //最大长度int Start;          //开始位置
}Disk_Node;
Disk_Node Disk_Head;void Init_Disk()
{Disk_Head.Max_length=MaxDisk;Disk_Head.Start=0;
}bool Init_MFD()
{pmfd=(MFD *)new MFD;   //带头节点的单向链表MFD *p=pmfd;ifstream ifs("MFD.txt");  //文件的输入流对象if(!ifs){cerr<<"错误:无法打开文件"<<endl;p->next=NULL;p->Ufd_next=NULL;return false;}while(!ifs.eof()){p->next=(MFD *)new MFD;ifs>>p->next->User_name>>p->next->User_passwd>>p->next->End;  if(p->next->End>Max_End)Max_End=p->next->End;p=p->next;p->Ufd_next=NULL;p->next=NULL;}ifs.close();return true;
}void Print_UFD()
{UFD *p=pufd->next;  if(!p){cout<<"抱歉,该用户没有创建任何文件,请先创建!!!"<<endl;return ;}cout<<"文件名\t\t最大文件长度\t文件权限\t起始位置\t文件长度"<<endl;while(p){cout<<p->File_name<<"\t\t"<<p->Max_File_length;if(p->Protect==0)cout<<"\t\t"<<"---";else if(p->Protect==1)cout<<"\t\t"<<"r-x";else if(p->Protect==2)cout<<"\t\t"<<"rwx";cout<<"\t\t"<<p->Start;cout<<"\t\t"<<p->File_length<<endl;p=p->next;}
}bool Init_UFD(char *name)
{ifstream ifs(name); pufd=(UFD *)new UFD;UFD *p=pufd;char temp[MaxDisk];bool Index=false;if(!ifs){cerr<<"错误:无法打开文件"<<endl;p->next=NULL;return false;}while(!ifs.eof()){memset(temp,'\0',sizeof(temp));p->next=(UFD *)new UFD;if(!Index){  pmfd->Ufd_next=p->next;Index=true;}ifs>>p->next->File_name>>p->next->Max_File_length>>p->next->Protect>>p->next->Start>>p->next->File_length;ifs>>temp;if(temp[0]=='#')temp[0]='\0';for(int i=p->next->Start,j=1;j<=p->next->Max_File_length-1;i++,j++){Disk_Size[i]=temp[j-1];if(!Disk_Size[i])break;}Disk_Head.Max_length-=p->next->Max_File_length;// Disk_Head.Start+=p->next->Max_File_length;p=p->next;p->next=NULL;}ifs.close();  return true;
}void Rename_File()
{string File_name;UFD *temp=pufd;char Index;
SD:cout<<"请输入文件的名字:"<<endl;cin>>File_name;while(temp){if(temp->File_name==File_name){cout<<"请输入新的文件名:"<<endl;cin>>File_name;temp->File_name=File_name;break;}temp=temp->next;}if(!temp){cout<<"抱歉,输入的文件不存在,无法完成重命名文件操作,是否继续操作<y/n>?"<<endl;cin>>Index;if(Index=='y')goto SD;elsereturn ;}elsecout<<"修改成功!!!"<<endl;
}bool User_Check()
{string User_passwd;int Count=0;while(1){cout<<"请输入用户名:";cin>>User_name;
INIT:cout<<"请输入密码:";cin>>User_passwd;MFD *p=pmfd->next;char temp[30];memset(temp,'\0',sizeof(temp));strcpy(temp,User_name);Count++;while(p){if(User_name==p->User_name){if(User_passwd==p->User_passwd)cout<<"登入成功."<<endl;else{cout<<"抱歉,密码错误,登陆失败,请重新输入!!!"<<endl;if(Count==3){cout<<"密码错误次数过多,系统运行结束!!!"<<endl;return false;}goto INIT;}strcat(temp,".txt"); Init_UFD(temp);//          Print_UFD();Disk_Head.Start=Max_End;return true;}p=p->next;}cout<<"用户名不存在,请重新输入!!!"<<endl;}
//  return false;
}           void Init_AFD()
{pafd=(AFD *)new AFD;pafd->next=NULL;
}bool Create_MFD()//创建文件命令
{string User_name;char User_passwd[30];MFD *p = pmfd;cout<<"请输入要创建的用户名: ";cin>>User_name;cout<<"请输入"<<User_name<<"用户的密码:(默认为:admin)";getchar();cin.getline(User_passwd,30);if(User_passwd[0]=='\0')strcpy(User_passwd,"admin");while(p){if(User_name==p->User_name){cout<<"此用户名已存在!!!"<<endl;return false;}if(!p->next)break;p= p->next;}p->next = (MFD *)new MFD;  //尾插法p=p->next;p->User_name=User_name;p->User_passwd=User_passwd;p->End=0;p->next = NULL;p->Ufd_next = NULL;Max_User--;return true;
}  //应该是 不同的用户下的UFD文件名是不一样的啊,怎么出问题了bool Create_UFD()//创建文件命令
{string File_name;UFD *p = pufd;unsigned int Protect;int Max_File_length;
//  AFD *pa = pafd;cout<<"请输入要创建的文件名: ";cin>>File_name;cout<<"请输入要创建的文件保护类型:";cin>>Protect;cout<<"请输入文件的最大容量:"<<endl;cin>>Max_File_length;while(p){if(File_name==p->File_name){cout<<"此文件名已存在!!!"<<endl;return false;}if(!p->next)break;p= p->next;}p->next = (UFD *)new UFD;  //尾插法p=p->next;p->File_name=File_name;p->Max_File_length=Max_File_length;p->Start=Disk_Head.Start;p->Protect = Protect;
//  p->Time_info=      //暂定p->File_length = 0;     //刚创建文件时,文件是空的Disk_Head.Start+=Max_File_length;p->next = NULL;      //我觉得这部分代码有问题;用户创建了一个文件并不代表该文件就被打开了return true;
}bool Delete_UFD()  //关于主目录的用户文件夹的文件删除-->先这样写,好吧    //如果文件已经打开了,是不能删除的
{string File_name;cout<<"请输入要删除的文件名:";cin>>File_name;UFD *p=pufd,*temp;AFD *pa=pafd;while(pa->next){if(File_name==pa->next->File_name){cout<<"抱歉,该文件已被打开,请先关闭,再进行删除操作!!!"<<endl;return false;}}while(p->next){if(File_name==p->next->File_name){temp=p->next;p->next=p->next->next;  //如果说要回收模拟的磁盘空间的话,应该是回收最大长度//  Disk_Head.Max_length+=temp->Max_File_length;    //链表中删除了,其他的文件内容的起始位置不变即可,又没事,还是照样可以访问数据的嘛delete temp;cout<<"文件删除成功!!!"<<endl;return true;}p=p->next;}cout<<"抱歉,要删除的文件不存在!!!"<<endl;return false;
}bool Open()
{string File_name;unsigned int Protect;cout<<"请输入要打开的文件名:";cin>>File_name;UFD *p=pufd->next;AFD *pa=pafd->next;while(pa){if(File_name==pa->File_name){cout<<"文件"<<File_name<<"已经打开!!!"<<endl;return true;}if(!pa->next)break;pa=pa->next;}if(!pa)     //如果找不到,或者打开的文件目录链表为空表pa=pafd;while(p){if(File_name==p->File_name){if(!Max_Open){cout<<"抱歉,最多只能打开5个文件,请先关闭其他打开的文件再操作!!!"<<endl;return false;}if(p->Protect==0){cout<<"抱歉,此文件不可执行任何操作!!!"<<endl;return false;}cout<<"请选择以什么样的方式打开文件<1-只读,2-可读可写>:";cin>>Protect;pa->next=(AFD *)new AFD;pa=pa->next;pa->File_name=p->File_name;pa->Start=p->Start;pa->File_length=p->File_length;pa->Max_File_length=p->Max_File_length;pa->Protect=Protect;if(Protect==1)pa->Pointer=0;   //Poniter取0表示此时用户无法写数据(没有空间的含义)elsepa->Pointer=p->File_length;pa->next=NULL;Max_Open--;cout<<"文件"<<File_name<<"已经打开!!!"<<endl;return true;}p=p->next;}cout<<"抱歉,要打开的文件不存在!!!"<<endl;return false;
}void Close()
{string file_name;UFD *pu=pufd->next;cout<<"请输入要关闭的文件名:";cin>>file_name;AFD *p=pafd,*temp;while(p&&p->next){if(file_name==p->next->File_name){temp=p->next;p->next=p->next->next;if(temp->Protect==2)      //可写的文件才有权把新写入的数据也保存起来嘛{while(pu){if(temp->File_name==pu->File_name){pu->File_length=temp->Pointer;break;}pu=pu->next;}}delete temp;cout<<"文件"<<file_name<<"关闭成功!!!"<<endl;return ;}p=p->next;}cout<<"抱歉,要关闭的文件没有被打开!!!"<<endl;
}bool Read_File()  //因为读写都是通过修改运行文件目录的Pointer去模拟的嘛
{string File_name;       //你要读文件的话,你这文件肯定得在运行/打开文件目录里面,是吧unsigned int length;AFD *p=pafd->next;cout<<"请输入要读的文件名:";cin>>File_name;cout<<"请输入要读取的长度:";  //读取的话,实际中文件的长度并不会改变cin>>length;          //即读取的长度并不能保存回去,为了方便(如果用户是读数据的话,pointer始终不变)while(p){if(File_name==p->File_name){for(int i=p->Start,j=1;j<=length;i++,j++)cout<<Disk_Size[i];cout<<endl;cout<<"文件"<<File_name<<"读取成功!!!"<<endl;return true;}p=p->next;}cout<<"读取失败,文件没有打开过!!!"<<endl;return false;
}bool Write_File()  //写的话,自然是运行文件目录
{string File_name;unsigned int length;AFD *p=pafd->next;char temp[MaxDisk]={'\0'};cout<<"请输入要写的文件名:";cin>>File_name;while(p){if(File_name==p->File_name){if(p->Protect!=2){cout<<"文件"<<File_name<<"不可写"<<endl;return false;}cout<<"请输入要写入的长度:"<<endl;cin>>length;if(p->Pointer+length<=p->Max_File_length){cout<<"请写入指定长度的内容:<以回车作为结束符>"<<endl;getchar();gets(temp);for(int i=p->Start+p->File_length,j=1;j<=strlen(temp);i++,j++)Disk_Size[i]=temp[j-1];p->Pointer += length;cout<<"文件"<<File_name<<"写入成功!!!"<<endl;}else{cout<<"欲写入的数据大小发生溢出,已超过文件的分配容量,写入失败!!!"<<endl;return false;}return true;}p=p->next;}cout<<"写入失败,文件没有打开过!!!"<<endl;return false;
}void Destroy_Space()
{MFD *pm=pmfd;while(pm){pmfd=pmfd->next;delete pm;pm=pmfd;}AFD *pa=pafd;while(pa){pafd=pafd->next;delete pa;pa=pafd;}UFD *pu=pufd;while(pu){pufd=pufd->next;delete pu;pu=pufd;}
}void Save_MFD()
{ofstream ofs;        //文件的输出流对象ofs.open("MFD.txt");if(!ofs.is_open()){cout<<"The MFD can't open!!!"<<endl;if(flag=='y')cout<<"正在保存主目录用户名信息..."<<endl;elseofs.close();  //该语句待定}MFD *p=pmfd->next;while(p){if(p->User_name==User_name)p->End=Disk_Head.Start;ofs<<p->User_name<<" "<<p->User_passwd<<" "<<p->End;if(p->next)ofs<<"\n";    p=p->next;}ofs.close();
}void Save_UFD(char *name)
{ofstream ofs;        //文件的输出流对象char temp[MaxDisk]={'\0'};ofs.open(name);if(!ofs.is_open()){cout<<"The "<<name<<"文件 can't open!!!"<<endl;ofs.close();  //该语句待定,这语句真的用的很妙,因为我并没有马上退出这次函数调用了}UFD *p=pufd->next;while(p){memset(temp,'\0',sizeof(temp));for(int i=p->Start,j=1;j<=p->Max_File_length;i++,j++){if(Disk_Size[i])temp[j-1]=Disk_Size[i];elsebreak;}if(!temp[0])        //如果文件没有数据的话,就用空格表示此文件没有任何内容temp[0]='#'; ofs<<p->File_name<<" "<<p->Max_File_length<<" "<<p->Protect<<" "<<p->Start<<" "<<p->File_length<<" "<<temp;if(p->next)ofs<<"\n";p=p->next;}ofs.close();
}void Quit_System()
{AFD *pa=pafd->next;UFD *pu=pufd->next;while(pa){if(pa->Protect==2)  //2表示可写   //1表示只读  //0表示不可操作{while(pu){if(pa->File_name==pu->File_name){pu->File_length=pa->Pointer;break;}pu=pu->next;}}pa=pa->next;}char temp[30];strcpy(temp,User_name);strcat(temp,".txt");Save_MFD();Save_UFD(temp);Print_UFD();Destroy_Space();
}void Print_Help()
{system("color 0b");cout<<"************************二级文件系统演示*************************"<<endl;cout<<"*\t\t命令             说明            *"<<endl; cout<<"*\t\tlogin           登录系统        *"<<endl; cout<<"*\t\tcreate          创建文件        *"<<endl; cout<<"*\t\tdelete          删除文件        *"<<endl; cout<<"*\t\topen            打开文件        *"<<endl; cout<<"*\t\tclose           关闭文件        *"<<endl; cout<<"*\t\tread            读取文件        *"<<endl; cout<<"*\t\twrite           写入文件        *"<<endl;cout<<"*\t\tls               显示目录        *"<<endl;cout<<"*\t\trename           重命文件        *"<<endl;cout<<"*\t\thelp         帮助菜单        *"<<endl;cout<<"*\t\tcls          清除屏幕        *"<<endl;cout<<"*\t\tlogout           切换用户        *"<<endl;cout<<"*\t\tquit         退出系统        *"<<endl; cout<<"*****************************************************************"<<endl;
}void System_Init()
{
Start:Print_Help();Init_Disk();if(!Init_MFD()){int num;cout<<"主目录还未创建,是否创建<y/n>!!!"<<endl;cin>>flag;cout<<"请输入欲创建的用户文件夹的个数(1-10):"<<endl;cin>>num;if(flag=='y'){while(num--){Create_MFD();if(!Max_User){    cout<<"本系统,最多支持10个用户,创建多余用户失败,请删除其他用户,再做尝试!!!"<<endl;return ;}}Save_MFD();cout<<"主目录已经创建完成,用户各自目录已得到保存,是否继续<y/n>!!!"<<endl;cin>>flag;if(flag=='y')goto Start;}}return ;
}void File_System()
{while(1){string Command;cout<<"请输入命令:";cin>>Command;if(Command=="create")Create_UFD();else if(Command=="delete")Delete_UFD();else if(Command=="open")Open();else if(Command=="close")Close();else if(Command=="read")Read_File();else if(Command=="write")Write_File();else if(Command=="quit"){ Quit_System();break;}else if(Command=="ls")Print_UFD();else if(Command=="cls")system("cls");else if(Command=="login"){if(!User_Check())break;Init_AFD();}else if(Command=="rename")Rename_File();else if(Command=="logout"){cout<<"用户登出成功!!!"<<endl;Quit_System();System_Init();File_System();}elsePrint_Help();}
}int main()   //我保存,我不能连我的指针域也保存啊,这是不对的吧
{System_Init();File_System();return 0;
}

操作系统课程设计之二级文件系统演示相关推荐

  1. 操作系统课程设计文件管理二级文件系统

    一.课程设计的目的 本课程设计是学习完<计算机操作系统>课程后,进行的一次全面的综合训练,通过课程设计,让我更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强 ...

  2. java编写文件系统的方法_操作系统课程设计模拟文件系统Java

    [实例简介] 一个操作系统课程设计,使用java语言模拟磁盘文件系统实现,实现了FAT算法 [实例截图] [核心代码] e692cc3b-c785-40f6-babe-2f9d5383f034 └── ...

  3. 计算机操作实践的课程描述,计算机操作系统课程设计实践报告-Read.DOC

    计算机操作系统课程设计实践报告-Read <计算机操作系统>课程设计实践报告 班级:计科31班第二组 组长:吕岭 小组成员:邢自成.叶林.张鹰 [问题描述] 模拟二级以上的多级文件目录管理 ...

  4. python枪战项目计划书_燕山大学操作系统课程设计计划书

    燕山大学操作系统课程设计计划书 燕山大学课程设计计划书 课程设计名称:操作系统 题目:多道程序缓冲区协同操作 年级:2016级 开发小组名称:WWW. 小组负责人: 课题组成员: 姓名 学号 班级 分 ...

  5. GeekOS操作系统课程设计 project1

    GeekOS操作系统课程设计 project1 项目设计1 一.项目设计目的 二.项目设计要求 三.步骤 1.修改project1/src/geekos/elf.c文件 1.1 在函数Parse_EL ...

  6. 操作系统课程设计pintos project1实验摘记

    前言: 本篇意在记录本学期结束的操作系统课程设计pintos project1实验报告和实现过程.整个实验参考了多篇文章也查阅了一些代码,其中部分内容或与其他文章相同,还请见谅.同时,也为了测试CSD ...

  7. 操作系统课程设计geekos project1-3

    概述 实验环境 GeekOS-0.3.0 Bochs和Vmware介绍 开发过程 编译运行 配置文件 前导知识 一.全局描述符表GDT(Global Descriptor Table) 二.段选择子( ...

  8. java时间片轮转调度(操作系统课程设计)

    操作系统课程设计之时间片轮转调度算法模拟(Java版本可视化) 1. 课程设计要求 本次课程设计的题目是,时间片轮转调度算法的模拟实现.要求在充分理解时间片轮转调度算法原理的基础上,编写一个可视化的算 ...

  9. linux课程设计题目主存空间的分配与回收,可变分区分配与回收,哈尔滨理工大学操作系统课程设计报告.doc-资源下载在线文库www.lddoc.cn...

    可变分区分配与回收,哈尔滨理工大学 操作系统课程设计报告.doc 哈 尔 滨 理 工 大 学 课 程 设 计 ( 操 作 系 统 ) 题 目 可变分区分配与回收 (首次适应算法) 班 级 计算机科学与 ...

  10. 华南理工大学计算机操作系统课程设计大作业银行家死锁避免算法模拟,2016春操作系统大作业银行家死锁避免算法模拟.doc...

    文档介绍: 2016春操作系统大作业银行家死锁避免算法模拟20160501华南理工大学"计算机操作系统"课程设计大作业计算机科学与技术专业:春2015班级:号:2015047420 ...

最新文章

  1. 一文介绍机器学习中的三种特征选择方法
  2. Enterprise Manager Cloud Control 安装
  3. 自定义边界_如何批量生成CAD填充的边界?
  4. webStroage案例
  5. 辽宁省风力发电行业“十四五”前景规划及竞争策略分析报告2022-2028年版
  6. 【操作系统】分页内存管理
  7. 百度云:centos7.0+ 安装宝塔与ShopXO开源商城(从0搭建到部署上线) - 教程篇
  8. opencv_python使用cv2.imread()读取中文路径报错问题(转)
  9. SQL数据库相关 FMDB框架的使用
  10. c#学习总结(一)---Mr.Zhang
  11. 洛谷2805 [NOI2009]植物大战僵尸 (拓扑排序+最小割)
  12. c语言 iostream,C语言 我应该在哪里使用iostream类?
  13. oracle闰年,oracle 闰年判断
  14. Spring Cloud入门-Oauth2授权之JWT集成(Hoxton版本)
  15. 【UE】初识Slate编辑器-理解一个最基础的编辑器界面
  16. 造梦无双服务器维护12月17日,《造梦无双》12月31日V0.82版本更新公告:迎战北王,寻斗天君...
  17. 推荐一个制作卡通头像的网站(超强)
  18. python美化excel_Python 使用 prettytable 库打印表格(美化输出)
  19. 网络基础 -- 网络分层与三次握手、四次挥手
  20. linux ps-l命令详解,ps命令实用方法.ps -l ps -L详解

热门文章

  1. 计算机没有本地网络,网络连接里没有本地连接
  2. Spring新手教程
  3. SQL数据库面试题以及答案(50题)
  4. 服务器内存系统,服务器内存系统容量
  5. 计算机硬盘突然只有一个c盘,win10硬盘消失了只剩下c盘怎么恢复_win10硬盘突然消失只有c盘解决方法-win7之家...
  6. anaconda各个版本下载资源
  7. Intel altera opencl 入门
  8. CAD地形图等高线标高批量取整工具,解决等高线标高出现小数的问题,等高线高程批量取整,在指定限差内将等高线标高修改为最接近的整数
  9. Apache Hive 下载与安装
  10. java实训文献_java实训论文参考文献写作指导