import os
import tkinter as tk
from tkinter import filedialog, messagebox, ttk
from datetime import datetime
import shutil
class FileExplorer:
def __init__(self, root):
[Link] = root
[Link]("Advanced File Explorer")
[Link]("1000x700")
# Status bar
self.status_var = [Link]()
self.status_var.set("Welcome to Advanced File Explorer")
self.status_bar = [Link]([Link], textvariable=self.status_var, relief=[Link],
anchor="w")
self.status_bar.pack(side=[Link], fill=tk.X)
# Current directory label
self.current_dir_label = [Link]([Link], text="Current Directory:", anchor='w')
self.current_dir_label.pack(fill=tk.X, padx=10, pady=5)
self.current_dir_var = [Link]()
self.current_dir_var.set([Link]())
self.current_dir_entry = [Link]([Link], textvariable=self.current_dir_var,
state='readonly')
self.current_dir_entry.pack(fill=tk.X, padx=10, pady=5)
# Search bar
self.search_frame = [Link]([Link])
self.search_frame.pack(fill=tk.X, padx=10, pady=5)
self.search_var = [Link]()
self.search_entry = [Link](self.search_frame, textvariable=self.search_var, width=50)
self.search_entry.pack(side=[Link], padx=5)
self.search_button = [Link](self.search_frame, text="Search",
command=self.search_files)
self.search_button.pack(side=[Link], padx=5)
# File tree view
[Link] = [Link]([Link], columns=("Type", "Size", "Modified"),
show="headings")
[Link]("Type", text="Type")
[Link]("Size", text="Size")
[Link]("Modified", text="Last Modified")
[Link](fill=[Link], expand=True, padx=10, pady=5)
[Link]("<Double-1>", self.on_item_double_click)
[Link]("<Button-3>", self.show_context_menu)
# Context menu
self.context_menu = [Link]([Link], tearoff=0)
self.context_menu.add_command(label="Open", command=self.open_selected_item)
self.context_menu.add_command(label="Delete",
command=self.delete_selected_item)
self.context_menu.add_command(label="Rename",
command=self.rename_selected_item)
self.context_menu.add_command(label="Move", command=self.move_selected_item)
self.context_menu.add_command(label="Copy", command=self.copy_selected_item)
self.context_menu.add_command(label="Properties", command=self.view_properties)
# Buttons
self.button_frame = [Link]([Link])
self.button_frame.pack(fill=tk.X, padx=10, pady=5)
self.open_button = [Link](self.button_frame, text="Open Directory",
command=self.open_directory)
self.open_button.pack(side=[Link], padx=5)
self.refresh_button = [Link](self.button_frame, text="Refresh",
command=[Link])
self.refresh_button.pack(side=[Link], padx=5)
self.sort_button = [Link](self.button_frame, text="Sort", command=self.sort_files)
self.sort_button.pack(side=[Link], padx=5)
self.exit_button = [Link](self.button_frame, text="Exit", command=[Link])
self.exit_button.pack(side=[Link], padx=5)
# Keyboard shortcuts
[Link]("<Control-o>", lambda e: self.open_directory())
[Link]("<Control-r>", lambda e: [Link]())
[Link]("<Control-q>", lambda e: [Link]())
# Initialize the file view
self.populate_tree([Link]())
def update_status(self, message):
self.status_var.set(message)
def open_directory(self):
directory = [Link]()
if directory:
self.current_dir_var.set(directory)
self.populate_tree(directory)
self.update_status(f"Opened directory: {directory}")
def refresh(self):
self.populate_tree(self.current_dir_var.get())
self.update_status("Refreshed directory view")
def populate_tree(self, directory):
for item in [Link].get_children():
[Link](item)
try:
for entry in [Link](directory):
entry_type = "File" if entry.is_file() else "Directory"
entry_size = [Link](entry) if entry.is_file() else ""
last_modified = [Link]([Link]().st_mtime).strftime('%Y-%m-
%d %H:%M:%S')
[Link]("", "end", iid=[Link], text=[Link],
values=(entry_type, entry_size, last_modified))
self.update_status(f"Loaded contents of: {directory}")
except Exception as e:
[Link]("Error", f"Failed to open directory: {str(e)}")
self.update_status("Error loading directory")
def on_item_double_click(self, event):
self.open_selected_item()
def open_selected_item(self):
selected_item = [Link]()
if selected_item:
item_path = selected_item[0]
if [Link](item_path):
self.current_dir_var.set(item_path)
self.populate_tree(item_path)
self.update_status(f"Opened folder: {item_path}")
elif [Link](item_path):
self.open_file(item_path)
def open_file(self, file_path):
try:
with open(file_path, "r") as file:
content = [Link]()
file_viewer = [Link]([Link])
file_viewer.title([Link](file_path))
text_widget = [Link](file_viewer, wrap="word")
text_widget.insert("1.0", content)
text_widget.pack(fill=[Link], expand=True)
self.update_status(f"Opened file: {file_path}")
except Exception as e:
[Link]("Error", f"Failed to open file: {str(e)}")
self.update_status("Error opening file")
def delete_selected_item(self):
selected_item = [Link]()
if selected_item:
item_path = selected_item[0]
try:
if [Link](item_path):
[Link](item_path)
else:
[Link](item_path)
self.populate_tree(self.current_dir_var.get())
self.update_status(f"Deleted: {item_path}")
except Exception as e:
[Link]("Error", f"Failed to delete item: {str(e)}")
self.update_status("Error deleting item")
def rename_selected_item(self):
selected_item = [Link]()
if selected_item:
item_path = selected_item[0]
new_name = [Link](initialdir=[Link](item_path),
initialfile=[Link](item_path))
if new_name:
try:
[Link](item_path, new_name)
self.populate_tree(self.current_dir_var.get())
self.update_status(f"Renamed to: {new_name}")
except Exception as e:
[Link]("Error", f"Failed to rename item: {str(e)}")
self.update_status("Error renaming item")
def move_selected_item(self):
selected_item = [Link]()
if selected_item:
item_path = selected_item[0]
target_directory = [Link]()
if target_directory:
try:
[Link](item_path, target_directory)
self.populate_tree(self.current_dir_var.get())
self.update_status(f"Moved to: {target_directory}")
except Exception as e:
[Link]("Error", f"Failed to move item: {str(e)}")
self.update_status("Error moving item")
def copy_selected_item(self):
selected_item = [Link]()
if selected_item:
item_path = selected_item[0]
target_directory = [Link]()
if target_directory:
try:
if [Link](item_path):
[Link](item_path, [Link](target_directory,
[Link](item_path)))
else:
shutil.copy2(item_path, target_directory)
self.populate_tree(self.current_dir_var.get())
self.update_status(f"Copied to: {target_directory}")
except Exception as e:
[Link]("Error", f"Failed to copy item: {str(e)}")
self.update_status("Error copying item")
def search_files(self):
query = self.search_var.get().lower()
if query:
for item in [Link].get_children():
[Link](item)
directory = self.current_dir_var.get()
try:
for root, _, files in [Link](directory):
for file in files:
if query in [Link]():
file_path = [Link](root, file)
entry_size = [Link](file_path)
last_modified =
[Link]([Link](file_path)).strftime('%Y-%m-%d %H:%M:%S')
[Link]("", "end", iid=file_path, text=file,
values=("File", entry_size, last_modified))
self.update_status(f"Search completed for: {query}")
except Exception as e:
[Link]("Error", f"Search failed: {str(e)}")
self.update_status("Error during search")
def show_context_menu(self, event):
try:
selected_item = [Link]()
if selected_item:
self.context_menu.post(event.x_root, event.y_root)
except Exception as e:
[Link]("Error", f"Failed to show context menu: {str(e)}")
self.update_status("Error showing context menu")
def sort_files(self):
# Sort files in ascending order by name
try:
directory = self.current_dir_var.get()
files = sorted([Link](directory), key=lambda x: [Link]())
for item in [Link].get_children():
[Link](item)
for entry in files:
entry_type = "File" if entry.is_file() else "Directory"
entry_size = [Link](entry) if entry.is_file() else ""
last_modified = [Link]([Link]().st_mtime).strftime('%Y-%m-
%d %H:%M:%S')
[Link]("", "end", iid=[Link], text=[Link],
values=(entry_type, entry_size, last_modified))
self.update_status("Files sorted by name")
except Exception as e:
[Link]("Error", f"Failed to sort files: {str(e)}")
self.update_status("Error sorting files")
def view_properties(self):
# Show properties of the selected item
selected_item = [Link]()
if selected_item:
item_path = selected_item[0]
try:
is_directory = [Link](item_path)
size = self.get_human_readable_size([Link](item_path)) if not is_directory
else "N/A"
last_modified =
[Link]([Link](item_path)).strftime('%Y-%m-%d %H:%M:%S')
properties_message = (
f"Name: {[Link](item_path)}\n"
f"Type: {'Directory' if is_directory else 'File'}\n"
f"Size: {size}\n"
f"Last Modified: {last_modified}"
)
[Link]("Properties", properties_message)
self.update_status(f"Viewed properties for: {item_path}")
except Exception as e:
[Link]("Error", f"Failed to view properties: {str(e)}")
self.update_status("Error viewing properties")
@staticmethod
def get_human_readable_size(size):
# Convert bytes to human-readable size
for unit in ['B', 'KB', 'MB', 'GB', 'TB']:
if size < 1024:
return f"{size:.2f} {unit}"
size /= 1024
return f"{size:.2f} PB"
if __name__ == "__main__":
root = [Link]()
app = FileExplorer(root)
[Link]()