文件目录管理与显示
给出目录和文件信息,编程实现将其排列成一棵有一定缩进的树。
要求:
(1)设计文件和目录信息树的存储结构。
(2)从文件或键盘输入目录和文件信息,输入格式采用绝对路径法,即:
\A
\A\AA1
\A\AA1\aa1.doc
…
创建时要检查同一路径下不能有同名的目录或文件名。
(3)设计文件和目录信息树的输出格式(以凹入表的形式显示)。
(4)查找指定目录和文件。
(5)添加新目录或新文件。
(6)删除指定目录或文件,子目录能够被删除的前提是其为空,既不包含任何子目录和文件;根目录不能删除。
(7)扩充目录或文件信息,如创建时间、读写权限、文件长度或子目录包含的子目录和文件数等。
(8)对同一层次下的子目录或文件按创建时间有序输出。
(9)通配符的使用。如用“?”代表任意一个字符,用“*”表示任意多个任意字符。
扩展内容:
实现相对路径表示法。
#include <stdio.h>
#include <malloc.h>
#include <string>
#include <iostream>
#include <sstream>
using namespace std;
#include "Sibtree.h"
void add(SibTree *t1)
{
printf("输入目录文件信息以输入0结束:\n");
SibTreeNode *r, *r1, *r2;
char ifm[1000] = { '\0' }, name1[50], name2[50];
char *str;
int i, j, n;
while (1)
{
cin >> ifm;
str = ifm;
if (*str == '0')break;
r = t1->root;
if (r == NULL)
{
for (i = 0, str += 1; *str != '\\'&&*str != '\0'; str++, i++)
{
name1[i] = *str;
}
name1[i] = '\0';
if (*str == '\0')insertRoot(t1, name1);
else
printf("%s的路径不存在,不能添加\n", name1);
}
else
{
for (i = 0, str += 1; *str != '\\'&&*str != '\0'; str++, i++)
{
name1[i] = *str;
}
name1[i] = '\0';
if (search(t1, name1) == 0 && *str == '\0')
{
insertnextSibing(t1, r, name1);
}
if (search(t1, name1) == 0 && *str != '\0')printf("%s的路径不存在,不能添加\n", name1);
r1 = LevelOrderTraverse(t1->root, name1);
while (r1 != NULL)
{
if (*str == '\0')break;
for (i = 0, str += 1; *str != '\\'&&*str != '\0'; str++, i++)
{
name2[i] = *str;
}
name2[i] = '\0';
if (*str == '\0')
{
if (insertChild(t1, r1, name2)){ break; }
}
else
{
n = children(r1);
for (j = 1; j <= n; j++)
{
if (strcmp(child(r1, j)->data, name2) == 0)break;
}
if (j <= n)r2 = child(r1, j);
else r2 = NULL;
if (r2 == NULL)printf("%s的路径不存在,不能添加\n", name2);
}
n = children(r1);
for (j = 1; j <= n; j++)
{
if (strcmp(child(r1, j)->data, name2) == 0)break;
}
if (j <= n)r1 = child(r1, j);
else r1 = NULL;
}
}
}
}
void check(SibTree *t)
{
SibTreeNode *r;
printf("输入要查找的文件名:");
char name[50];
cin >> name;
r = mohu1LevelOrderTraverse(t->root, name);
if (r == NULL)
//printf("没有此文件\n");
printf("\n");
else
{
printf("此文件找到,创建时间为:");
printf("%d/%d/%d %d:%d:%d", r->year, r->month, r->day, r->hour, r->minute, r->second);
printf("\t子目录个数为:");
printf("%d\n", children(r));
}
}
void Delete(SibTree *t)
{
SibTreeNode *r, *p, *kid;
printf("输入要删除的文件名:");
char name[50];
cin >> name;
r = LevelOrderTraverse(t->root, name);
if (r == NULL)printf("没有此文件!\n");
else
{
if (r->firstChild != NULL)printf("有子文件不能删除!\n");