This commit is contained in:
nm1 2026-11-04 00:33:23 +05:30
commit 74ae93a96e

View file

@ -0,0 +1,243 @@
export file metadata and view it in nice frontend
**from llm**
It sounds like you're looking to create a **file explorer with metadata** and **tree view** functionality. Here's a general approach on how you can achieve this, even if you don't have direct access to the files themselves:
### Steps to Create a File Explorer with Metadata and Tree View
1. **Get the Directory Structure:**
You can use a **recursive function** to traverse the directory and collect information about files and folders in a hierarchical structure (like a tree view). The key is to capture all relevant metadata along with each file and folder.
2. **Collect Metadata:**
For each file and folder, you can collect the following metadata:
* **File name**
* **File size**
* **File type/extension**
* **Creation date**
* **Last modified date**
* **Permissions** (Read/Write/Execute)
* **Owner (if available)**
3. **Export the Data:**
Once you've gathered all this information, you can export it to a structured format such as **JSON** or **CSV**. JSON would be ideal for this, as it can represent hierarchical data.
4. **Display with Tree View:**
You can then build a tree view UI using HTML, JavaScript, and CSS (e.g., using frameworks like **React** or **Vue.js**). Each item in the tree can be toggled open or closed to reveal the metadata for files and folders.
### Code Example (Python Script to Export Metadata)
Here’s a Python script that will scan a directory and gather the metadata:
```python
import os
import json
from datetime import datetime
def get_file_metadata(file_path):
stats = os.stat(file_path)
return {
"name": os.path.basename(file_path),
"size": stats.st_size,
"creation_date": datetime.fromtimestamp(stats.st_ctime).strftime('%Y-%m-%d %H:%M:%S'),
"modified_date": datetime.fromtimestamp(stats.st_mtime).strftime('%Y-%m-%d %H:%M:%S'),
"permissions": oct(stats.st_mode)[-3:],
"is_directory": os.path.isdir(file_path)
}
def build_tree(directory):
directory_tree = []
for root, dirs, files in os.walk(directory):
root_metadata = get_file_metadata(root)
tree_item = {
"path": root,
"metadata": root_metadata,
"files": [],
"subfolders": []
}
# Get files in the current folder
for file in files:
file_path = os.path.join(root, file)
file_metadata = get_file_metadata(file_path)
tree_item["files"].append(file_metadata)
# Get subfolders (recursive)
for dir in dirs:
dir_path = os.path.join(root, dir)
dir_metadata = get_file_metadata(dir_path)
tree_item["subfolders"].append(build_tree(dir_path)[0]) # Recursively add subfolders
directory_tree.append(tree_item)
return directory_tree
def save_to_json(data, filename="directory_structure.json"):
with open(filename, "w") as f:
json.dump(data, f, indent=4)
# Example usage
directory = "/path/to/your/directory" # Change this to your directory
tree_data = build_tree(directory)
save_to_json(tree_data)
```
### Explanation:
1. **`get_file_metadata`**: This function collects metadata for a file or folder (like creation and modification dates, size, permissions, etc.).
2. **`build_tree`**: This function uses `os.walk()` to traverse the directory and construct a tree with file metadata and subdirectories.
3. **`save_to_json`**: This function saves the gathered data in a JSON file.
or bash script can be used too
```sh
#!/bin/bash
# Usage: ./dir_tree.sh /path/to/directory > output.json
DIR=${1:-.}
echo "["
first=1
find "$DIR" -print0 | while IFS= read -r -d '' file; do
[ $first -eq 0 ] && echo ","
first=0
name=$(basename "$file")
size=$(stat -c %s "$file")
created=$(stat -c %w "$file") # May be '-' on some systems
modified=$(stat -c %y "$file")
perms=$(stat -c %a "$file")
is_dir=false
[ -d "$file" ] && is_dir=true
# Output as JSON object
echo " {"
echo " \"path\": \"${file//\"/\\\"}\","
echo " \"name\": \"${name//\"/\\\"}\","
echo " \"size\": $size,"
echo " \"creation_date\": \"${created//\"/\\\"}\","
echo " \"modified_date\": \"${modified//\"/\\\"}\","
echo " \"permissions\": \"$perms\","
echo " \"is_directory\": $is_dir"
echo -n " }"
done
echo
echo "]"
tar
```
### Frontend: Displaying the Tree View
You can use **HTML, CSS, and JavaScript** to display the file structure and metadata in a tree view. If you're familiar with **React**, it's even easier.
Here’s an example of how you can structure the tree view with HTML:
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>File Explorer</title>
<style>
.folder { font-weight: bold; cursor: pointer; }
.file { font-style: italic; }
.metadata { margin-left: 20px; }
.hidden { display: none; }
</style>
</head>
<body>
<div id="tree-view"></div>
<script>
// Sample JSON data (replace with your actual JSON from the Python script)
const treeData = [
{
"path": "/path/to/folder",
"metadata": {
"name": "folder",
"size": 1234,
"creation_date": "2025-05-08 14:30:00",
"modified_date": "2025-05-08 14:45:00",
"permissions": "755",
"is_directory": true
},
"files": [
{
"name": "file1.txt",
"size": 200,
"creation_date": "2025-05-08 14:30:00",
"modified_date": "2025-05-08 14:40:00",
"permissions": "644",
"is_directory": false
}
],
"subfolders": []
}
];
function createTreeView(data, parentElement) {
data.forEach(item => {
const folderDiv = document.createElement("div");
folderDiv.classList.add("folder");
folderDiv.textContent = item.metadata.name;
folderDiv.onclick = () => toggleFolder(folderDiv, item);
const metadataDiv = document.createElement("div");
metadataDiv.classList.add("metadata", "hidden");
metadataDiv.innerHTML = `
<p>Size: ${item.metadata.size} bytes</p>
<p>Created: ${item.metadata.creation_date}</p>
<p>Modified: ${item.metadata.modified_date}</p>
<p>Permissions: ${item.metadata.permissions}</p>
`;
folderDiv.appendChild(metadataDiv);
parentElement.appendChild(folderDiv);
// Recursively add files and subfolders
if (item.files.length > 0 || item.subfolders.length > 0) {
const subFolderDiv = document.createElement("div");
subFolderDiv.classList.add("subfolder");
item.files.forEach(file => {
const fileDiv = document.createElement("div");
fileDiv.classList.add("file");
fileDiv.textContent = file.name;
subFolderDiv.appendChild(fileDiv);
});
item.subfolders.forEach(subfolder => {
createTreeView([subfolder], subFolderDiv);
});
folderDiv.appendChild(subFolderDiv);
}
});
}
function toggleFolder(folderDiv, item) {
const metadataDiv = folderDiv.querySelector(".metadata");
metadataDiv.classList.toggle("hidden");
}
createTreeView(treeData, document.getElementById("tree-view"));
</script>
</body>
</html>
```
### Steps to Implement:
1. **Data Fetching:** You will need to load your **JSON** file (from the Python script) into the front-end application. This can be done using a simple `fetch()` call or by directly embedding the JSON data.
2. **Displaying Metadata:** Each folder and file item can display its name and, when clicked, show the metadata (size, creation date, etc.).
3. **Tree View Toggle:** The metadata will be hidden by default and only visible when the folder is toggled.
### Conclusion:
By following this method, you can gather all file and folder metadata, export it as JSON, and then visualize the data in a **tree structure** with toggling effects on the front end. This would allow you to review file and folder properties without direct access to the actual files.