#include <gtk/gtk.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
// 文件结构体定义
typedef struct File {
char name[50];
char content[5000];
time_t create_time;
time_t modify_time;
int permissions; // 0b111: 读、写、执行权限
int type; // 0: 普通文件, 1: 目录
struct File* next;
} File;
// 用户结构体定义
typedef struct User {
char username[50];
char password[50];
File* files;
struct User* next;
} User;
// 全局变量
User* users = NULL;
User* current_user = NULL;
GtkWidget* file_list = NULL;
GtkWidget* content_view = NULL;
GtkWidget* file_info_label = NULL;
// 函数声明
User* find_user(const char* username);
void add_user(const char* username, const char* password);
File* find_file(const char* filename);
void add_file(const char* filename, int type);
void update_file_list();
void update_file_info(const char* filename);
void show_file_content(const char* filename);
void save_file_content(const char* filename, const char* content);
void set_permissions(const char* filename, int permissions);
// 创建用户界面
void create_user_dialog(GtkWidget* window) {
GtkWidget* dialog;
GtkWidget* content_area;
GtkWidget* username_entry;
GtkWidget* password_entry;
GtkWidget* label;
GtkWidget* box;
gint response;
dialog = gtk_dialog_new_with_buttons("创建用户",
GTK_WINDOW(window),
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
"创建", GTK_RESPONSE_ACCEPT,
"取消", GTK_RESPONSE_CANCEL,
NULL);
content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
gtk_container_add(GTK_CONTAINER(content_area), box);
label = gtk_label_new("用户名:");
gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 5);
username_entry = gtk_entry_new();
gtk_box_pack_start(GTK_BOX(box), username_entry, FALSE, FALSE, 5);
label = gtk_label_new("密码:");
gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 5);
password_entry = gtk_entry_new();
gtk_entry_set_visibility(GTK_ENTRY(password_entry), FALSE);
gtk_box_pack_start(GTK_BOX(box), password_entry, FALSE, FALSE, 5);
gtk_widget_show_all(content_area);
response = gtk_dialog_run(GTK_DIALOG(dialog));
if (response == GTK_RESPONSE_ACCEPT) {
const char* username = gtk_entry_get_text(GTK_ENTRY(username_entry));
const char* password = gtk_entry_get_text(GTK_ENTRY(password_entry));
if (strlen(username) > 0 && strlen(password) > 0) {
if (find_user(username) != NULL) {
GtkWidget* error_dialog = gtk_message_dialog_new(
GTK_WINDOW(window),
GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
"用户 '%s' 已存在!", username);
gtk_dialog_run(GTK_DIALOG(error_dialog));
gtk_widget_destroy(error_dialog);
} else {
add_user(username, password);
GtkWidget* info_dialog = gtk_message_dialog_new(
GTK_WINDOW(window),
GTK_DIALOG_MODAL,
GTK_MESSAGE_INFO,
GTK_BUTTONS_OK,
"用户 '%s' 创建成功!", username);
gtk_dialog_run(GTK_DIALOG(info_dialog));
gtk_widget_destroy(info_dialog);
}
} else {
GtkWidget* error_dialog = gtk_message_dialog_new(
GTK_WINDOW(window),
GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
"用户名和密码不能为空!");
gtk_dialog_run(GTK_DIALOG(error_dialog));
gtk_widget_destroy(error_dialog);
}
}
gtk_widget_destroy(dialog);
}
// 登录界面
void login_dialog(GtkWidget* window) {
GtkWidget* dialog;
GtkWidget* content_area;
GtkWidget* username_entry;
GtkWidget* password_entry;
GtkWidget* label;
GtkWidget* box;
gint response;
dialog = gtk_dialog_new_with_buttons("用户登录",
GTK_WINDOW(window),
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
"登录", GTK_RESPONSE_ACCEPT,
"取消", GTK_RESPONSE_CANCEL,
NULL);
content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
gtk_container_add(GTK_CONTAINER(content_area), box);
label = gtk_label_new("用户名:");
gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 5);
username_entry = gtk_entry_new();
gtk_box_pack_start(GTK_BOX(box), username_entry, FALSE, FALSE, 5);
label = gtk_label_new("密码:");
gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 5);
password_entry = gtk_entry_new();
gtk_entry_set_visibility(GTK_ENTRY(password_entry), FALSE);
gtk_box_pack_start(GTK_BOX(box), password_entry, FALSE, FALSE, 5);
gtk_widget_show_all(content_area);
response = gtk_dialog_run(GTK_DIALOG(dialog));
if (response == GTK_RESPONSE_ACCEPT) {
const char* username = gtk_entry_get_text(GTK_ENTRY(username_entry));
const char* password = gtk_entry_get_text(GTK_ENTRY(password_entry));
User* user = find_user(username);
if (user != NULL && strcmp(user->password, password) == 0) {
current_user = user;
update_file_list();
gtk_widget_set_sensitive(file_list, TRUE);
GtkWidget* info_dialog = gtk_message_dialog_new(
GTK_WINDOW(window),
GTK_DIALOG_MODAL,
GTK_MESSAGE_INFO,
GTK_BUTTONS_OK,
"欢迎回来, %s!", username);
gtk_dialog_run(GTK_DIALOG(info_dialog));
gtk_widget_destroy(info_dialog);
} else {
GtkWidget* error_dialog = gtk_message_dialog_new(
GTK_WINDOW(window),
GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
"用户名或密码错误!");
gtk_dialog_run(GTK_DIALOG(error_dialog));
gtk_widget_destroy(error_dialog);
}
}
gtk_widget_destroy(dialog);
}
// 创建文件对话框
void create_file_dialog(GtkWidget* window) {
if (current_user == NULL) {
GtkWidget* error_dialog = gtk_message_dialog_new(
GTK_WINDOW(window),
GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
"请先登录!");
gtk_dialog_run(GTK_DIALOG(error_dialog));
gtk_widget_destroy(error_dialog);
return;
}
GtkWidget* dialog;
GtkWidget* content_area;
GtkWidget* filename_entry;
GtkWidget* label;
GtkWidget* box;
GtkWidget* file_radio;
GtkWidget* dir_radio;
GtkWidget* type_box;
gint response;
int type = 0; // 0: 文件, 1: 目录
dialog = gtk_dialog_new_with_buttons("创建文件/目录",
GTK_WINDOW(window),
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
"创建", GTK_RESPONSE_ACCEPT,
"取消", GTK_RESPONSE_CANCEL,
NULL);
content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
gtk_container_add(GTK_CONTAINER(content_area), box);
label = gtk_label_new("文件名:");
gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 5);
filename_entry = gtk_entry_new();
gtk_box_pack_start(GTK_BOX(box), filename_entry, FALSE, FALSE, 5);
label = gtk_label_new("类型:");
gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 5);
type_box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10);
gtk_box_pack_start(GTK_BOX(box), type_box, FALSE, FALSE, 5);
file_radio = gtk_radio_button_new_with_label(NULL, "文件");
dir_radio = gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(file_radio), "目录");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(file_radio), TRUE);
gtk_box_pack_start(GTK_BOX(type_box), file_radio, FALSE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(type_box), dir_radio, FALSE, FALSE, 5);
g_signal_connect(file_radio, "toggled", G_CALLBACK(
[](GtkToggleButton* toggle, gpointer data) {
if (gtk_toggle_button_get_active(toggle)) {
*(int*)data = 0;
}
}), &type);
g_signal_connect(dir_radio, "toggled", G_CALLBACK(
[](GtkToggleButton* toggle, gpointer data) {
if (gtk_toggle_button_get_active(toggle)) {
*(int*)data = 1;
}
}), &type);
gtk_widget_show_all(content_area);
response = gtk_dialog_run(GTK_DIALOG(dialog));
if (response == GTK_RESPONSE_ACCEPT) {
const char* filename = gtk_entry_get_text(GTK_ENTRY(filename_entry));
if (strlen(filename) > 0) {
if (find_file(filename) != NULL) {
GtkWidget* error_dialog = gtk_message_dialog_new(
GTK_WINDOW(window),
GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
"文件 '%s' 已存在!", filename);
gtk_dialog_run(GTK_DIALOG(error_dialog));
gtk_widget_destroy(error_dialog);
} else {
add_file(filename, type);
update_file_list();
GtkWidget* info_dialog = gtk_message_dialog_new(
GTK_WINDOW(window),
GTK_DIALOG_MODAL,
GTK_MESSAGE_INFO,
GTK_BUTTONS_OK,
"%s '%s' 创建成功!", type ? "目录" : "文件", filename);
gtk_dialog_run(GTK_DIALOG(info_dialog));
gtk_widget_destroy(info_dialog);
}
} else {
GtkWidget* error_dialog = gtk_message_dialog_new(
GTK_WINDOW(window),
GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
"文件名不能为空!");
gtk_dialog_run(GTK_DIALOG(error_dialog));
gtk_widget_destroy(error_dialog);
}
}
gtk_widget_destroy(dialog);
}
// 删除文件对话框
void delete_file_dialog(GtkWidget* window) {
if (current_user == NULL) {
GtkWidget* error_dialog = gtk_message_dialog_new(
GTK_WINDOW(window),
GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
"请先登录!");
gtk_dialog_run(GTK_DIALOG(error_dialog));
gtk_widget_destroy(error_dialog);
return;
}
GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(file_list));
GtkTreeModel* model;
GtkTreeIter iter;
if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
char* filename;
gtk_tree_model_get(model, &iter, 0, &filename, -1);
GtkWidget* confirm_dialog = gtk_message_dialog_new(
GTK_WINDOW(window),
GTK_DIALOG_MODAL,
GTK_MESSAGE_QUESTION,
GTK_BUTTONS_YES_NO,
"确定要删除文件 '%s' 吗?", filename);
gint response = gtk_dialog_run(GTK_DIALOG(confirm_dialog));
if (response == GTK_RESPONSE_YES) {
File* file = find_file(filename);
if (file != NULL) {
File* prev = NULL;
File* current = current_user->files;
while (current != NULL && strcmp(current->name, filename) != 0) {
prev = current;
current = current->next;
}
if (prev == NULL) {
current_user->files = current->next;
} else {
prev->next = current->next;
}
g_free(current);
update_file_list();
gtk_label_set_text(GTK_LABEL(file_info_label), "");
GtkTextBuffer* buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(content_view));
gtk_text_buffer_set_text(buffer, "", -1);
GtkWidget* info_dialog = gtk_message_dialog_new(
GTK_WINDOW(window),
GTK_DIALOG_MODAL,
GTK_MESSAGE_INFO,
GTK_BUTTONS_OK,
"文件 '%s' 已删除!", filename);
gtk_dialog_run(GTK_DIALOG(info_dialog));
gtk_widget_destroy(info_dialog);
}
}
gtk_widget_destroy(confirm_dialog);
g_free(filename);
} else {
GtkWidget* error_dialog = gtk_message_dialog_new(
GTK_WINDOW(window),
GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
"请先选择一个文件!");
gtk_dialog_run(GTK_DIALOG(error_dialog));
gtk_widget_destroy(error_dialog);
}
}
// 重命名文件对话框
void rename_file_dialog(GtkWidget* window) {
if (current_user == NULL) {
GtkWidget* error_dialog = gtk_message_dialog_new(
GTK_WINDOW(window),
GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
"请先登录!");
gtk_dialog_run(GTK_DIALOG(error_dialog));
gtk_widget_destroy(error_dialog);
return;
}
GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(file_list));
GtkTreeModel* model;
GtkTreeIter iter;
if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
char* old_filename;
gtk_tree_model_get(model, &iter, 0, &old_filename, -1);
GtkWidget* dialog;
GtkWidget* content_area;
GtkWidget* filename_entry;
GtkWidget* label;
GtkWidget* box;
gint response;
dialog = gtk_dialog_new_with_buttons("重命名文件",
GTK_WINDOW(window),
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
"重命名", GTK_RESPONSE_ACCEPT,
"取消", GTK_RESPONSE_CANCEL,
NULL);
content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
gtk_container_add(GTK_CONTAINER(content_area), box);
label = gtk_label_new("新文件名:");
gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 5);
filename_entry = gtk_entry_new();
gtk_entry_set_text(GTK_ENTRY(filename_entry), old_filename);
gtk_box_pack_start(GTK_BOX(box), filename_entry, FALSE, FALSE, 5);
gtk_widget_show_all(content_area);
response = gtk_dialog_run(GTK_DIALOG(dialog));
if (response == GTK_RESPONSE_ACCEPT) {
const char* new_filename = gtk_entry_get_text(GTK_ENTRY(filename_entry));
if (strlen(new_filename) > 0 && strcmp(old_filename, new_filename) != 0) {
if (find_file(new_filename) != NULL) {
GtkWidget* error_dialog = gtk_message_dialog_new(
GTK_WINDOW(window),
GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
"文件 '%s' 已存在!", new_filename);
gtk_dialog_run(GTK_DIALOG(error_dialog));
gtk_widget_destroy(error_dialog);
} else {
File* file = find_file(old_filename);
if (file != NULL) {
strcpy(file->name, new_filename);
file->modify_time = time(NULL);
update_file_list();
update_file_info(new_filename);
GtkWidget* info_dialog = gtk_message_dialog_new(
GTK_WINDOW(window),
GTK_DIALOG_MODAL,
GTK_MESSAGE_INFO,
GTK_BUTTONS_OK,
"文件已重命名为 '%s'", new_filename);
gtk_dialog_run(GTK_DIALOG(info_dialog));
gtk_widget_destroy(info_dialog);
}
}
} else {
GtkWidget* error_dialog = gtk_message_dialog_new(
GTK_WINDOW(window),
GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
"文件名不能为空或与原文件名相同!");
gtk_dialog_run(GTK_DIALOG(error_dialog));
gtk_widget_destroy(error_dialog);
}
}
gtk_widget_destroy(dialog);
g_free(old_filename);
} else {
GtkWidget* error_dialog = gtk_message_dialog_new(
GTK_WINDOW(window),
GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
"请先选择一个文件!");
gtk_dialog_run(GTK_DIALOG(error_dialog));
gtk_widget_destroy(error_dialog);
}
}
// 编辑文件内容对话框
void edit_file_dialog(GtkWidget* window) {
if (current_user == NULL) {
GtkWidget* error_dialog = gtk_message_dialog_new(
GTK_WINDOW(window),
GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
"请先登录!");
gtk_dialog_run(GTK_DIALOG(error_dialog));
gtk_widget_destroy(error_dialog);
return;
}
GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(file_list));
GtkTreeModel* model;
GtkTreeIter iter;
if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
char* filename;
gtk_tree_model_get(model, &iter, 0, &filename, -1);
File* file = find_file(filename);
if (file != NULL) {
if (file->type == 1) { // 目录
GtkWidget* error_dialog = gtk_message_dialog_new(
GTK_WINDOW(window),
GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
"'%s' 是目录,无法编辑内容!", filename);
gtk_dialog_run(GTK_DIALOG(error_dialog));
gtk_widget_destroy(error_dialog);
g_free(filename);
return;
}
// 检查写权限
if (!(file->permissions & 0b010)) {
GtkWidget* error_dialog = gtk_message_dialog_new(
GTK_WINDOW(window),
GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
"没有写入权限,无法编辑文件!");
gtk_dialog_run(GTK_DIALOG(error_dialog));
gtk_widget_destroy(error_dialog);
g_free(filename);
return;
}
GtkWidget* dialog;
GtkWidget* content_area;
GtkWidget* text_view;
GtkWidget* scrolled_window;
GtkTextBuffer* buffer;
gint response;
dialog = gtk_dialog_new_with_buttons("编辑文件内容",
GTK_WINDOW(window),
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
"保存", GTK_RESPONSE_ACCEPT,
"取消", GTK_RESPONSE_CANCEL,
NULL);
content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
scrolled_window = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_container_set_size_request(GTK_CONTAINER(scrolled_window), 400, 300);
gtk_container_add(GTK_CONTAINER(content_area), scrolled_window);
text_view = gtk_text_view_new();
buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view));
gtk_text_buffer_set_text(buffer, file->content, -1);
gtk_container_add(GTK_CONTAINER(scrolled_window), text_view);
gtk_widget_show_all(content_area);
response = gtk_dialog_run(GTK_DIALOG(dialog));
if (response == GTK_RESPONSE_ACCEPT) {
GtkTextIter start, end;
gtk_text_buffer_get_start_iter(buffer, &start);
gtk_text_buffer_get_end_iter(buffer, &end);
gchar* new_content = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
save_file_content(filename, new_content);
update_file_info(filename);
show_file_content(filename);
g_free(new_content);
GtkWidget* info_dialog = gtk_message_dialog_new(
GTK_WINDOW(window),
GTK_DIALOG_MODAL,
GTK_MESSAGE_INFO,
GTK_BUTTONS_OK,
"文件 '%s' 已保存!", filename);
gtk_dialog_run(GTK_DIALOG(info_dialog));
gtk_widget_destroy(info_dialog);
}
gtk_widget_destroy(dialog);
}
g_free(filename);
} else {
GtkWidget* error_dialog = gtk_message_dialog_new(
GTK_WINDOW(window),
GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
"请先选择一个文件!");
gtk_dialog_run(GTK_DIALOG(error_dialog));
gtk_widget_destroy(error_dialog);
}
}
// 修改文件权限对话框
void change_permissions_dialog(GtkWidget* window) {
if (current_user == NULL) {
GtkWidget* error_dialog = gtk_message_dialog_new(
GTK_WINDOW(window),
GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
"请先登录!");
gtk_dialog_run(GTK_DIALOG(error_dialog));
gtk_widget_destroy(error_dialog);
return;
}
GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(file_list));
GtkTreeModel* model;
GtkTreeIter iter;
if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
char* filename;
gtk_tree_model_get(model, &iter, 0, &filename, -1);
File* file = find_file(filename);
if (file != NULL) {
GtkWidget* dialog;
GtkWidget* content_area;
GtkWidget* box;
GtkWidget* read_check;
GtkWidget* write_check;
GtkWidget* execute_check;
gint response;
dialog = gtk_dialog_new_with_buttons("修改文件权限",
GTK_WINDOW(window),
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
"确定", GTK_RESPONSE_ACCEPT,
"取消", GTK_RESPONSE_CANCEL,
NULL);
content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
gtk_container_add(GTK_CONTAINER(content_area), box);
read_check = gtk_check_button_new_with_label("读取权限");
write_check = gtk_check_button_new_with_label("写入权限");
execute_check = gtk_check_button_new_with_label("执行权限");
// 设置当前权限状态
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(read_check), file->permissions & 0b100);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(write_check), file->permissions & 0b010);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(execute_check), file->permissions & 0b001);
gtk_box_pack_start(GTK_BOX(box), read_check, FALSE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(box), write_check, FALSE, FALSE, 5);
gtk_box_pack_start(GTK_BOX(box), execute_check, FALSE, FALSE, 5);
gtk_widget_show_all(content_area);
response = gtk_dialog_run(GTK_DIALOG(dialog));
if (response == GTK_RESPONSE_ACCEPT) {
int new_permissions = 0;
new_permissions |= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(read_check)) ? 0b100 : 0;
new_permissions |= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(write_check)) ? 0b010 : 0;
new_permissions |= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(execute_check)) ? 0b001 : 0;
set_permissions(filename, new_permissions);
update_file_info(filename);
GtkWidget* info_dialog = gtk_message_dialog_new(
GTK_WINDOW(window),
GTK_DIALOG_MODAL,
GTK_MESSAGE_INFO,
GTK_BUTTONS_OK,
"文件 '%s' 权限已更新!", filename);
gtk_dialog_run(GTK_DIALOG(info_dialog));
gtk_widget_destroy(info_dialog);
}
gtk_widget_destroy(dialog);
}
g_free(filename);
} else {
GtkWidget* error_dialog = gtk_message_dialog_new(
GTK_WINDOW(window),
GTK_DIALOG_MODAL,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_OK,
"请先选择一个文件!");
gtk_dialog_run(GTK_DIALOG(error_dialog));
gtk_widget_destroy(error_dialog);
}
}
// 用户查找函数
User* find_user(const char* username) {
User* current = users;
while (current != NULL) {
if (strcmp(current->username, username) == 0) {
return current;
}
current = current->next;
}
return NULL;
}
// 添加用户函数
void add_user(const char* username, const char* password) {
User* new_user = (User*)g_malloc(sizeof(User));
strcpy(new_user->username, username);
strcpy(new_user->password, password);
new_user->files = NULL;
new_user->next = users;
users = new_user;
}
// 文件查找函数
File* find_file(const char* filename) {
if (current_user == NULL) return NULL;
File* current = current_user->files;
while (current != NULL) {
if (strcmp(current->name, filename) == 0) {
return current;
}
current = current->next;
}
return NULL;
}
// 添加文件函数
void add_file(const char* filename, int type) {
File* new_file = (File*)g_malloc(sizeof(File));
strcpy(new_file->name, filename);
new_file->create_time = time(NULL);
new_file->modify_time = new_file->create_time;
new_file->permissions = type ? 0b111 : 0b110; // 目录默认 rwx,文件默认 rw-
new_file->type = type;
if (!type) { // 如果是文件,初始化内容
strcpy(new_file->content, "");
}
new_file->next = current_user->files;
current_user->files = new_file;
}
// 更新文件列表
void update_file_list() {
GtkListStore* store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(file_list)));
gtk_list_store_clear(store);
if (current_user == NULL) return;
File* current = current_user->files;
while (current != NULL) {
GtkTreeIter iter;
gtk_list_store_append(store, &iter);
char* type_str = current->type ? "目录" : "文件";
char* perm_str = (char*)g_malloc(4);
perm_str[0] = (current->permissions & 0b100) ? 'r' : '-';
perm_str[1] = (current->permissions & 0b010) ? 'w' : '-';
perm_str[2] = (current->permissions & 0b001) ? 'x' : '-';
perm_str[3] = '\0';
char create_time_str[26];
ctime_r(¤t->create_time, create_time_str);
create_time_str[24] = '\0'; // 去掉换行符
gtk_list_store_set(store, &iter,
0, current->name,
1, type_str,
2, perm_str,
3, create_time_str,
-1);
g_free(perm_str);
current = current->next;
}
}
// 更新文件信息
void update_file_info(const char* filename) {
File* file = find_file(filename);
if (file == NULL) {
gtk_label_set_text(GTK_LABEL(file_info_label), "");
return;
}
char info[500];
char create_time_str[26];
char modify_time_str[26];
ctime_r(&file->create_time, create_time_str);
ctime_r(&file->modify_time, modify_time_str);
create_time_str[24] = '\0'; // 去掉换行符
modify_time_str[24] = '\0'; // 去掉换行符
char* type_str = file->type ? "目录" : "文件";
char* perm_str = (char*)g_malloc(4);
perm_str[0] = (file->permissions & 0b100) ? 'r' : '-';
perm_str[1] = (file->permissions & 0b010) ? 'w' : '-';
perm_str[2] = (file->permissions & 0b001) ? 'x' : '-';
perm_str[3] = '\0';
int size = file->type ? 0 : strlen(file->content);
sprintf(info, "文件名: %s\n类型: %s\n权限: %s\n大小: %d 字节\n创建时间: %s\n修改时间: %s",
file->name, type_str, perm_str, size, create_time_str, modify_time_str);
gtk_label_set_text(GTK_LABEL(file_info_label), info);
g_free(perm_str);
}
// 显示文件内容
void show_file_content(const char* filename) {
File* file = find_file(filename);
if (file == NULL) {
GtkTextBuffer* buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(content_view));
gtk_text_buffer_set_text(buffer, "", -1);
return;
}
if (file->type == 1) { // 目录
GtkTextBuffer* buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(content_view));
gtk_text_buffer_set_text(buffer, "[目录]", -1);
return;
}
// 检查读权限
if (!(file->permissions & 0b100)) {
GtkTextBuffer* buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(content_view));
gtk_text_buffer_set_text(buffer, "[没有读取权限]", -1);
return;
}
// 50 字符换行
char formatted_content[5000];
int len = strlen(file->content);
int pos = 0;
for (int i = 0; i < len; i++) {
formatted_content[pos++] = file->content[i];
if ((i + 1) % 50 == 0 && i != len - 1) {
formatted_content[pos++] = '\n';
}
}
formatted_content[pos] = '\0';
GtkTextBuffer* buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(content_view));
gtk_text_buffer_set_text(buffer, formatted_content, -1);
}
// 保存文件内容
void save_file_content(const char* filename, const char* content) {
File* file = find_file(filename);
if (file == NULL || file->type == 1) return;
strncpy(file->content, content, sizeof(file->content) - 1);
file->content[sizeof(file->content) - 1] = '\0';
file->modify_time = time(NULL);
}
// 设置文件权限
void set_permissions(const char* filename, int permissions) {
File* file = find_file(filename);
if (file == NULL) return;
file->permissions = permissions;
file->modify_time = time(NULL);
}
// 文件选择回调
void on_file_selected(GtkTreeSelection* selection, gpointer data) {
GtkTreeModel* model;
GtkTreeIter iter;
if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
char* filename;
gtk_tree_model_get(model, &iter, 0, &filename, -1);
update_file_info(filename);
show_file_content(filename);
g_free(filename);
}
}
int main(int argc, char *argv[]) {
// 初始化 GTK
gtk_init(&argc, &argv);
// 创建主窗口
GtkWidget* window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_title(GTK_WINDOW(window), "文件管理模拟系统");
gtk_window_set_default_size(GTK_WINDOW(window), 800, 600);
g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
// 创建主布局(水平分割)
GtkWidget* hpaned = gtk_paned_new(GTK_ORIENTATION_HORIZONTAL);
gtk_container_add(GTK_CONTAINER(window), hpaned);
// 左侧面板:文件列表
GtkWidget* left_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
gtk_paned_add1(GTK_PANED(hpaned), left_vbox);
// 创建工具栏
GtkWidget* toolbar = gtk_toolbar_new();
gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);
gtk_box_pack_start(GTK_BOX(left_vbox), toolbar, FALSE, FALSE, 0);
// 添加工具按钮
GtkToolItem* create_user_item = gtk_tool_button_new_from_stock(GTK_STOCK_ADD);
gtk_tool_item_set_label(create_user_item, "创建用户");
g_signal_connect(create_user_item, "clicked", G_CALLBACK(create_user_dialog), window);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), create_user_item, -1);
GtkToolItem* login_item = gtk_tool_button_new_from_stock(GTK_STOCK_CONNECT);
gtk_tool_item_set_label(login_item, "登录");
g_signal_connect(login_item, "clicked", G_CALLBACK(login_dialog), window);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), login_item, -1);
GtkToolItem* separator = gtk_separator_tool_item_new();
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), separator, -1);
GtkToolItem* create_file_item = gtk_tool_button_new_from_stock(GTK_STOCK_NEW);
gtk_tool_item_set_label(create_file_item, "创建文件");
g_signal_connect(create_file_item, "clicked", G_CALLBACK(create_file_dialog), window);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), create_file_item, -1);
GtkToolItem* delete_file_item = gtk_tool_button_new_from_stock(GTK_STOCK_DELETE);
gtk_tool_item_set_label(delete_file_item, "删除文件");
g_signal_connect(delete_file_item, "clicked", G_CALLBACK(delete_file_dialog), window);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), delete_file_item, -1);
GtkToolItem* rename_file_item = gtk_tool_button_new_from_stock(GTK_STOCK_EDIT);
gtk_tool_item_set_label(rename_file_item, "重命名");
g_signal_connect(rename_file_item, "clicked", G_CALLBACK(rename_file_dialog), window);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), rename_file_item, -1);
GtkToolItem* edit_file_item = gtk_tool_button_new_from_stock(GTK_STOCK_SAVE);
gtk_tool_item_set_label(edit_file_item, "编辑内容");
g_signal_connect(edit_file_item, "clicked", G_CALLBACK(edit_file_dialog), window);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), edit_file_item, -1);
GtkToolItem* permissions_item = gtk_tool_button_new_from_stock(GTK_STOCK_PREFERENCES);
gtk_tool_item_set_label(permissions_item, "修改权限");
g_signal_connect(permissions_item, "clicked", G_CALLBACK(change_permissions_dialog), window);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), permissions_item, -1);
// 创建文件列表视图
GtkListStore* store = gtk_list_store_new(4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
file_list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
g_object_unref(store);
// 添加列
GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes("文件名", renderer, "text", 0, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(file_list), column);
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes("类型", renderer, "text", 1, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(file_list), column);
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes("权限", renderer, "text", 2, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(file_list), column);
renderer = gtk_cell_renderer_text_new();
column = gtk_tree_view_column_new_with_attributes("创建时间", renderer, "text", 3, NULL);
gtk_tree_view_append_column(GTK_TREE_VIEW(file_list), column);
// 设置选择模式
GtkTreeSelection* selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(file_list));
gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
g_signal_connect(selection, "changed", G_CALLBACK(on_file_selected), NULL);
// 将文件列表放入滚动窗口
GtkWidget* scrolled_window = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_container_add(GTK_CONTAINER(scrolled_window), file_list);
gtk_box_pack_start(GTK_BOX(left_vbox), scrolled_window, TRUE, TRUE, 0);
// 右侧面板:文件内容和信息
GtkWidget* right_vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
gtk_paned_add2(GTK_PANED(hpaned), right_vbox);
// 文件信息标签
file_info_label = gtk_label_new("");
gtk_label_set_justify(GTK_LABEL(file_info_label), GTK_JUSTIFY_LEFT);
gtk_label_set_line_wrap(GTK_LABEL(file_info_label), TRUE);
gtk_box_pack_start(GTK_BOX(right_vbox), file_info_label, FALSE, FALSE, 5);
// 文件内容文本视图
content_view = gtk_text_view_new();
gtk_text_view_set_editable(GTK_TEXT_VIEW(content_view), FALSE);
gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(content_view), GTK_WRAP_WORD);
scrolled_window = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_container_add(GTK_CONTAINER(scrolled_window), content_view);
gtk_box_pack_start(GTK_BOX(right_vbox), scrolled_window, TRUE, TRUE, 0);
// 设置初始状态
gtk_widget_set_sensitive(file_list, FALSE);
// 显示所有控件
gtk_widget_show_all(window);
// 进入主循环
gtk_main();
return 0;
} 改进一下