v1.0.0
- C-Template für CLI Tools
This commit is contained in:
commit
4a9b5e77f3
12
.gitattributes
vendored
Normal file
12
.gitattributes
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# Quelltext immer mit Unix-Zeilenenden speichern (LF)
|
||||||
|
*.c text eol=lf
|
||||||
|
*.h text eol=lf
|
||||||
|
|
||||||
|
# Binärdateien
|
||||||
|
*.exe binary -diff
|
||||||
|
*.obj binary -diff
|
||||||
|
*.pdb binary -diff
|
||||||
|
*.ilk binary -diff
|
||||||
|
|
||||||
|
# Sprache für GitHub-Statistiken
|
||||||
|
*.h linguist-language=C
|
12
.gitignore
vendored
Normal file
12
.gitignore
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
/*.obj
|
||||||
|
/*.exe
|
||||||
|
/build/**
|
||||||
|
!.gitkeep
|
||||||
|
/*.obj
|
||||||
|
/*.exe
|
||||||
|
/*.ilk
|
||||||
|
/*.pdb
|
||||||
|
|
||||||
|
# Custom:
|
||||||
|
*.zip
|
||||||
|
/NOTES
|
18
.vscode/c_cpp_properties.json
vendored
Normal file
18
.vscode/c_cpp_properties.json
vendored
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "windows-gcc-x64",
|
||||||
|
"includePath": [
|
||||||
|
"${workspaceFolder}/**"
|
||||||
|
],
|
||||||
|
"compilerPath": "cl",
|
||||||
|
"cStandard": "${default}",
|
||||||
|
"cppStandard": "${default}",
|
||||||
|
"intelliSenseMode": "windows-gcc-x64",
|
||||||
|
"compilerArgs": [
|
||||||
|
""
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"version": 4
|
||||||
|
}
|
10
.vscode/extensions.json
vendored
Normal file
10
.vscode/extensions.json
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"recommendations": [
|
||||||
|
"ms-vscode.cpptools", // C/C++ Support (IntelliSense, Debugging, CodeNav)
|
||||||
|
"aaron-bond.better-comments", // Verbesserte Kommentarfunktion
|
||||||
|
"usernamehw.errorlens", // Fehler direkt im Editor anzeigen
|
||||||
|
"eamodio.gitlens", // Git Integration (optional)
|
||||||
|
"actboy168.tasks", // Tasks Explorer GUI (optional)
|
||||||
|
"xaver.clang-format" // (optional) Automatische Formatierung mit clang-format
|
||||||
|
]
|
||||||
|
}
|
15
.vscode/launch.json
vendored
Normal file
15
.vscode/launch.json
vendored
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "Debug scanner.exe",
|
||||||
|
"type": "cppvsdbg",
|
||||||
|
"request": "launch",
|
||||||
|
"program": "${workspaceFolder}/build/output/treescanner.exe",
|
||||||
|
"args": [],
|
||||||
|
"stopAtEntry": false,
|
||||||
|
"cwd": "${workspaceFolder}",
|
||||||
|
"console": "externalTerminal"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
7
.vscode/settings.json
vendored
Normal file
7
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"files.encoding": "utf8",
|
||||||
|
"files.eol": "\n",
|
||||||
|
"editor.tabSize": 4,
|
||||||
|
"editor.insertSpaces": true
|
||||||
|
}
|
||||||
|
|
19
.vscode/tasks.json
vendored
Normal file
19
.vscode/tasks.json
vendored
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"version": "2.0.0",
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"label": "Build scanner.exe (MSVC)",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "cmd.exe",
|
||||||
|
"args": [
|
||||||
|
"/c",
|
||||||
|
"build.cmd"
|
||||||
|
],
|
||||||
|
"group": {
|
||||||
|
"kind": "build",
|
||||||
|
"isDefault": true
|
||||||
|
},
|
||||||
|
"problemMatcher": []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
27
LICENSE
Normal file
27
LICENSE
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
# 📄 `LICENSE` (MIT)
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2025 Adam Skotarczak
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
|
||||||
|
```
|
103
README.md
Normal file
103
README.md
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
# ⚙️ CLI-Template für C (MSVC)
|
||||||
|
|
||||||
|
Ein leichtgewichtiges C-Projekttemplate für die Kommandozeile unter Windows, vorbereitet für den Microsoft Visual C Compiler (MSVC).
|
||||||
|
|
||||||
|
## Inhalt
|
||||||
|
|
||||||
|
- [⚙️ CLI-Template für C (MSVC)](#️-cli-template-für-c-msvc)
|
||||||
|
- [Inhalt](#inhalt)
|
||||||
|
- [Features](#features)
|
||||||
|
- [Struktur](#struktur)
|
||||||
|
- [Voraussetzungen](#voraussetzungen)
|
||||||
|
- [Nutzung](#nutzung)
|
||||||
|
- [Dokumentation](#dokumentation)
|
||||||
|
- [Plattformhinweis](#plattformhinweis)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Rekursive Verzeichnissuche mit ASCII-Ausgabe
|
||||||
|
- Kompatibel mit `cl.exe` über `build.cmd`
|
||||||
|
- Debugging per `launch.json` (VS Code)
|
||||||
|
- Unicode-Ausgabe (📁 📄) für unterstützende Terminals
|
||||||
|
- Struktur für sauberen Code (main + Module)
|
||||||
|
|
||||||
|
[⚓](#inhalt)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Struktur
|
||||||
|
|
||||||
|
```plaintext
|
||||||
|
📁 treescanner # Projekt-Wurzelverzeichnis (Repository-Root)
|
||||||
|
📁 .vscode # Konfigurationsverzeichnis für Visual Studio Code
|
||||||
|
📄 c_cpp_properties.json # IntelliSense-Einstellungen (Compilerpfade, Defines etc.)
|
||||||
|
📄 extensions.json # Empfehlung installierbarer VS Code Extensions
|
||||||
|
📄 launch.json # Debug-Konfiguration (z. B. Programm, Argumente, Terminal)
|
||||||
|
📄 settings.json # Editor-spezifische Projekteinstellungen (z. B. Tabs, Formatierung)
|
||||||
|
📄 tasks.json # Build-Tasks (z. B. MSVC Build über build.cmd)
|
||||||
|
📁 build # Build-Artefakte (ausgabeorientiertes Verzeichnis)
|
||||||
|
📄 .gitkeep # Platzhalterdatei, damit Git leere Verzeichnisse behält
|
||||||
|
📁 output # Output-Ordner für kompilierte Binärdateien und Objekte
|
||||||
|
📄 app.obj # Objektdatei aus app.c
|
||||||
|
📄 main.obj # Objektdatei aus main.c
|
||||||
|
📄 treescanner.exe # Kompilierte lauffähige .exe-Datei
|
||||||
|
📄 build.cmd # Build-Skript für MSVC (ruft cl.exe via vcvars64.bat)
|
||||||
|
📄 clean.cmd # Hilfsskript zum Löschen von build/output
|
||||||
|
📁 include # Header-Dateien für Funktionsprototypen
|
||||||
|
📄 app.h # Deklaration von `scan_directory()`
|
||||||
|
📄 LICENSE # Lizenzdatei (hier: MIT License)
|
||||||
|
📄 README.md # Projektdokumentation (Nutzung, Build, Features etc.)
|
||||||
|
📁 src # Quellcode-Verzeichnis (.c-Dateien)
|
||||||
|
📄 app.c # Implementierung der rekursiven Verzeichnissuche
|
||||||
|
📄 main.c # Einstiegspunkt (main-Funktion)
|
||||||
|
📄 VERSION # Datei mit Versionsnummer (z. B. „0.1.0-dev“)
|
||||||
|
📄 .gitattributes # Git-spezifische Datei (z. B. Zeilenenden, Binärdateien, Sprache)
|
||||||
|
📄 .gitignore # Liste auszuschließender Dateien und Verzeichnisse (z. B. *.exe, /build/)
|
||||||
|
```
|
||||||
|
|
||||||
|
[⚓](#inhalt)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Voraussetzungen
|
||||||
|
|
||||||
|
- [Visual Studio Build Tools](https://visualstudio.microsoft.com/visual-cpp-build-tools/)
|
||||||
|
- MSVC `cl.exe` + `vcvars64.bat` korrekt eingebunden
|
||||||
|
|
||||||
|
[⚓](#inhalt)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Nutzung
|
||||||
|
|
||||||
|
```cmd
|
||||||
|
build.cmd
|
||||||
|
```
|
||||||
|
|
||||||
|
**Ausgabe:**
|
||||||
|
`build/output/scanner.exe`
|
||||||
|
|
||||||
|
[⚓](#inhalt)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Dokumentation
|
||||||
|
|
||||||
|
- [x] [C Code Style Guide für CLI-Projekte](./doc/code_style.md)
|
||||||
|
- [x] [Windows API Referenz – CLI-Toolkit](./doc/index.md)
|
||||||
|
|
||||||
|
[⚓](#inhalt)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Plattformhinweis
|
||||||
|
|
||||||
|
> ℹ️ Dieses Projekt ist aktuell auf **Windows** ausgelegt (MSVC, Windows API).
|
||||||
|
> Es enthält jedoch bereits `#ifdef _WIN32`-Konstrukte zur Vorbereitung einer plattformübergreifenden Umsetzung.
|
||||||
|
> Die POSIX-Version (`opendir`, `readdir`) kann später leicht ergänzt werden.
|
||||||
|
|
||||||
|
[⚓](#inhalt)
|
||||||
|
|
||||||
|
---
|
15
build.cmd
Normal file
15
build.cmd
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
@echo off
|
||||||
|
setlocal
|
||||||
|
chcp 65001 >nul
|
||||||
|
|
||||||
|
echo [INFO] Initialisiere MSVC Umgebung...
|
||||||
|
call "D:\windows\Programme\MSStudio\2022\BuildTools\VC\Auxiliary\Build\vcvars64.bat"
|
||||||
|
|
||||||
|
echo [INFO] Baue Projekt...
|
||||||
|
|
||||||
|
cl /c src\main.c /I include /Fo:build\output\main.obj
|
||||||
|
cl /c src\app.c /I include /Fo:build\output\app.obj
|
||||||
|
|
||||||
|
link build\output\main.obj build\output\app.obj /OUT:build\output\treescanner.exe /PDB:build\output\treescanner.pdb
|
||||||
|
|
||||||
|
echo [OK] Build abgeschlossen.
|
0
build/.gitkeep
Normal file
0
build/.gitkeep
Normal file
7
clean.cmd
Normal file
7
clean.cmd
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
@echo off
|
||||||
|
chcp 65001 >nul
|
||||||
|
|
||||||
|
echo [INFO] Lösche build/output...
|
||||||
|
rmdir /s /q build\output 2>nul
|
||||||
|
mkdir build\output
|
||||||
|
echo [OK] Sauber.
|
92
doc/code_style.md
Normal file
92
doc/code_style.md
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
# C Code Style Guide für CLI-Projekte
|
||||||
|
|
||||||
|
## 🔧 Allgemeines
|
||||||
|
|
||||||
|
- **Zeichencodierung:** UTF-8 (ohne BOM)
|
||||||
|
- **Zeilenenden:** LF (`\n`) – plattformunabhängig
|
||||||
|
- **Einrückung:** 4 Leerzeichen (keine Tabs)
|
||||||
|
- **Maximale Zeilenlänge:** 100 Zeichen (Ausnahme: ASCII-Bäume oder Formatstrings)
|
||||||
|
|
||||||
|
## 🧱 Präprozessor-Direktiven
|
||||||
|
|
||||||
|
```c
|
||||||
|
#ifndef APP_H
|
||||||
|
#define APP_H
|
||||||
|
|
||||||
|
// Keine Einrückung bei #define, #ifdef, #endif
|
||||||
|
// Kommentare nach #endif zur Orientierung bei größeren Headern
|
||||||
|
|
||||||
|
#endif // APP_H
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📦 Header-Dateien (`.h`)
|
||||||
|
|
||||||
|
- Funktionsprototypen sind **nicht eingerückt**
|
||||||
|
- Kommentare über dem Prototyp mit Doxygen-Stil (`/** ... */`)
|
||||||
|
- Header Guards oder `#pragma once` – aber nicht beides
|
||||||
|
|
||||||
|
```c
|
||||||
|
/**
|
||||||
|
* @brief Führt rekursive Verzeichnissuche durch.
|
||||||
|
*
|
||||||
|
* @param base_path Startpfad
|
||||||
|
* @param depth Rekursionstiefe (nur zur Einrückung)
|
||||||
|
*/
|
||||||
|
void scan_directory(const char *base_path, int depth);
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🧠 Funktionen
|
||||||
|
|
||||||
|
```c
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
// Code beginnt eingerückt
|
||||||
|
if (argc > 1) {
|
||||||
|
printf("Pfad: %s\n", argv[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- **Funktionsklammern immer öffnend auf derselben Zeile**
|
||||||
|
- Immer mit Rückgabetyp (`void`, `int`, etc.)
|
||||||
|
- Keine leeren Parameterlisten → `void` verwenden (`int foo(void)`)
|
||||||
|
|
||||||
|
## 🌳 Einrückung & Blöcke
|
||||||
|
|
||||||
|
```c
|
||||||
|
if (ok) {
|
||||||
|
mach_was();
|
||||||
|
} else {
|
||||||
|
mach_anders();
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- `if`, `else`, `while`, `for` – immer mit `{}` – auch bei einzeiligen Blöcken
|
||||||
|
- Klammern auf derselben Zeile
|
||||||
|
- Keine überflüssigen Leerzeilen innerhalb eines Blocks
|
||||||
|
|
||||||
|
## 🧾 Kommentare
|
||||||
|
|
||||||
|
- Doxygen-kompatibel für alles, was extern verwendet wird
|
||||||
|
- Inline-Kommentare nur bei **nicht sofort ersichtlicher Logik**
|
||||||
|
|
||||||
|
```c
|
||||||
|
// Rekursion starten, wenn Verzeichnis
|
||||||
|
scan_directory(sub_path, depth + 1);
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📁 Dateibenennung
|
||||||
|
|
||||||
|
| Elementtyp | Beispiel |
|
||||||
|
|------------------|------------------|
|
||||||
|
| Header-Dateien | `app.h` |
|
||||||
|
| Implementierung | `app.c` |
|
||||||
|
| Main-Einstieg | `main.c` |
|
||||||
|
| Konstanten/Makros| `config.h` |
|
||||||
|
|
||||||
|
## 📚 Optionaler Zusatz für Tools
|
||||||
|
|
||||||
|
- Doxygen mit `Doxyfile`
|
||||||
|
- `clang-format` für Einrückung und Formatierung
|
||||||
|
- `cppcheck` für statische Analyse
|
33
doc/filetime.md
Normal file
33
doc/filetime.md
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
# FILETIME – Strukturreferenz (Windows API)
|
||||||
|
|
||||||
|
Die `FILETIME`-Struktur repräsentiert Zeitangaben im Windows-Dateisystem in einer 64-Bit-Darstellung.
|
||||||
|
|
||||||
|
## Definition (aus `WinBase.h`)
|
||||||
|
|
||||||
|
```c
|
||||||
|
typedef struct _FILETIME {
|
||||||
|
DWORD dwLowDateTime;
|
||||||
|
DWORD dwHighDateTime;
|
||||||
|
} FILETIME;
|
||||||
|
```
|
||||||
|
|
||||||
|
## Beschreibung
|
||||||
|
|
||||||
|
- `FILETIME` speichert eine Zeit als Anzahl der 100-Nanosekunden-Intervalle seit dem 1. Januar 1601 (UTC).
|
||||||
|
- Wird oft in Kombination mit `WIN32_FIND_DATA` oder `GetFileTime()` verwendet.
|
||||||
|
|
||||||
|
## Umwandlung in lesbare Zeit
|
||||||
|
|
||||||
|
```c
|
||||||
|
FILETIME ft;
|
||||||
|
// ...füllen durch API-Aufruf...
|
||||||
|
|
||||||
|
SYSTEMTIME st;
|
||||||
|
FileTimeToSystemTime(&ft, &st);
|
||||||
|
printf("%d-%02d-%02d %02d:%02d\n", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute);
|
||||||
|
```
|
||||||
|
|
||||||
|
## Hinweise
|
||||||
|
|
||||||
|
- In lokalen Zeitzonen konvertieren: `FileTimeToLocalFileTime()`
|
||||||
|
- Für High-Level-Zeitverarbeitung besser `SYSTEMTIME` oder `time_t` verwenden
|
32
doc/getlasterror.md
Normal file
32
doc/getlasterror.md
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
# GetLastError – Fehlerdiagnose (Windows API)
|
||||||
|
|
||||||
|
`GetLastError()` liefert den Fehlercode des letzten fehlgeschlagenen Windows-API-Aufrufs.
|
||||||
|
|
||||||
|
## Definition
|
||||||
|
|
||||||
|
```c
|
||||||
|
DWORD GetLastError(void);
|
||||||
|
```
|
||||||
|
|
||||||
|
## Beispiel
|
||||||
|
|
||||||
|
```c
|
||||||
|
HANDLE hFile = CreateFile(...);
|
||||||
|
if (hFile == INVALID_HANDLE_VALUE) {
|
||||||
|
DWORD err = GetLastError();
|
||||||
|
printf("Fehlercode: %lu\n", err);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## FormatMessage für menschenlesbare Fehlertexte
|
||||||
|
|
||||||
|
```c
|
||||||
|
char buffer[256];
|
||||||
|
FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err, 0, buffer, sizeof(buffer), NULL);
|
||||||
|
printf("Fehler: %s\n", buffer);
|
||||||
|
```
|
||||||
|
|
||||||
|
## Hinweise
|
||||||
|
|
||||||
|
- Fehlercode ist thread-lokal gespeichert
|
||||||
|
- Immer direkt nach dem fehlerhaften Aufruf abfragen
|
31
doc/handle.md
Normal file
31
doc/handle.md
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
# HANDLE – Typreferenz (Windows API)
|
||||||
|
|
||||||
|
Ein `HANDLE` ist ein abstrakter Referenztyp in Windows, der auf Ressourcen verweist.
|
||||||
|
|
||||||
|
## Definition (aus `WinNT.h`)
|
||||||
|
|
||||||
|
```c
|
||||||
|
typedef void *HANDLE;
|
||||||
|
```
|
||||||
|
|
||||||
|
## Verwendung
|
||||||
|
|
||||||
|
Handles werden von vielen Windows-APIs zurückgegeben, z. B.:
|
||||||
|
|
||||||
|
- `CreateFile()` → HANDLE auf Datei
|
||||||
|
- `FindFirstFile()` → HANDLE für Suchkontext
|
||||||
|
- `CreateProcess()` → HANDLE auf Prozess
|
||||||
|
|
||||||
|
## Beispiel
|
||||||
|
|
||||||
|
```c
|
||||||
|
HANDLE hFind = FindFirstFile("*.txt", &find_data);
|
||||||
|
if (hFind == INVALID_HANDLE_VALUE) {
|
||||||
|
// Fehlerbehandlung
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Hinweise
|
||||||
|
|
||||||
|
- Handle müssen oft manuell freigegeben werden (`CloseHandle(h)`)
|
||||||
|
- Gültigkeitsprüfung oft mit `INVALID_HANDLE_VALUE`
|
39
doc/index.md
Normal file
39
doc/index.md
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
# 📚 Windows API Referenz – CLI-Toolkit
|
||||||
|
|
||||||
|
Diese Dokumentation enthält kompakte technische Beschreibungen zentraler WinAPI-Strukturen und -Funktionen, wie sie im `treeScanner`-Projekt verwendet werden.
|
||||||
|
|
||||||
|
## 🔍 Inhaltsverzeichnis
|
||||||
|
|
||||||
|
### 💾 Dateisystem
|
||||||
|
|
||||||
|
- [WIN32_FIND_DATA](winapi_notes.md)
|
||||||
|
Struktur für Dateiinformationen bei `FindFirstFile`
|
||||||
|
- [MAX_PATH](max_path.md)
|
||||||
|
Einschränkungen und erweiterte Pfadlängen in Windows
|
||||||
|
|
||||||
|
### 🧠 Systemtypen
|
||||||
|
|
||||||
|
- [HANDLE](handle.md)
|
||||||
|
Allgemeiner Ressourcentyp unter Windows
|
||||||
|
- [FILETIME](filetime.md)
|
||||||
|
Zeitformat in 100-ns-Schritten seit 1601
|
||||||
|
|
||||||
|
### 🧵 Fehlerbehandlung
|
||||||
|
|
||||||
|
- [GetLastError](getlasterror.md)
|
||||||
|
Windows-Fehlercode auslesen und verstehen
|
||||||
|
|
||||||
|
### 🌐 Unicode & Konsole
|
||||||
|
|
||||||
|
- [SetConsoleOutputCP](setconsoleoutputcp.md)
|
||||||
|
Codepage für UTF-8-Ausgabe einstellen
|
||||||
|
- [Unicode vs ANSI](unicode_console.md)
|
||||||
|
Warum Konsolen Zeichen falsch darstellen – und wie man es verhindert
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🛠 Erweiterung geplant
|
||||||
|
|
||||||
|
- POSIX-Alternativen (`opendir`, `readdir`)
|
||||||
|
- `SYSTEMTIME`, `FormatMessageW`, `CloseHandle`
|
||||||
|
- Fehlercode-Tabelle + eigene Fehlerklasse für CLI-Tools
|
28
doc/max_path.md
Normal file
28
doc/max_path.md
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
# MAX_PATH – Maximale Pfadlänge (Windows)
|
||||||
|
|
||||||
|
Windows beschränkt Pfade klassisch auf **260 Zeichen**. Diese Grenze ist durch den Wert `MAX_PATH` definiert.
|
||||||
|
|
||||||
|
## Definition
|
||||||
|
|
||||||
|
```c
|
||||||
|
#define MAX_PATH 260
|
||||||
|
```
|
||||||
|
|
||||||
|
## Beispiel
|
||||||
|
|
||||||
|
```c
|
||||||
|
char path[MAX_PATH];
|
||||||
|
snprintf(path, MAX_PATH, "C:\\Ordner\\Datei.txt");
|
||||||
|
```
|
||||||
|
|
||||||
|
## Überlange Pfade
|
||||||
|
|
||||||
|
Seit Windows 10 (ab Build 1607) kann man **lange Pfade bis 32.767 Zeichen** aktivieren:
|
||||||
|
|
||||||
|
- Voraussetzung: UTF-16-Pfade mit `\?\`-Präfix
|
||||||
|
- Beispiel: `\\?\C:\SehrLangerPfad\Datei.txt`
|
||||||
|
|
||||||
|
## Hinweise
|
||||||
|
|
||||||
|
- Ohne `\?\` gelten weiterhin 260 Zeichen
|
||||||
|
- Einige Windows-APIs und ältere Programme brechen bei langen Pfaden ab
|
32
doc/setconsoleoutputcp.md
Normal file
32
doc/setconsoleoutputcp.md
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
# SetConsoleOutputCP – Funktion (Windows API)
|
||||||
|
|
||||||
|
Mit `SetConsoleOutputCP()` kann die Ausgabe-Codepage der Konsole geändert werden – z. B. für UTF-8.
|
||||||
|
|
||||||
|
## Definition
|
||||||
|
|
||||||
|
```c
|
||||||
|
BOOL SetConsoleOutputCP(UINT wCodePageID);
|
||||||
|
```
|
||||||
|
|
||||||
|
## Parameter
|
||||||
|
|
||||||
|
- `wCodePageID`: Ziel-Codepage, z. B. `65001` für UTF-8
|
||||||
|
|
||||||
|
## Beispiel
|
||||||
|
|
||||||
|
```c
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
SetConsoleOutputCP(65001); // Aktiviert UTF-8-Ausgabe
|
||||||
|
printf("📁 Datei
|
||||||
|
");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Hinweise
|
||||||
|
|
||||||
|
- Nur unter Windows verfügbar
|
||||||
|
- Gilt nur für das aktive Konsolenfenster
|
||||||
|
- Muss vor Unicode-Ausgabe erfolgen
|
37
doc/unicode_console.md
Normal file
37
doc/unicode_console.md
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
# Unicode vs ANSI in der Windows-Konsole
|
||||||
|
|
||||||
|
Standardmäßig nutzt die Windows-Konsole eine ANSI-Codepage (z. B. 850 oder 1252). Für echte Unicode-Zeichen wie 📁 oder ✓ ist das oft ungeeignet.
|
||||||
|
|
||||||
|
## Problem
|
||||||
|
|
||||||
|
- Ohne UTF-8: Unicode-Zeichen erscheinen als Kästchen oder Müll
|
||||||
|
- Ausgabe wie `📁` ergibt `ƒôü` oder ähnliches
|
||||||
|
|
||||||
|
## Lösung
|
||||||
|
|
||||||
|
### 1. UTF-8 aktivieren
|
||||||
|
|
||||||
|
```c
|
||||||
|
#include <windows.h>
|
||||||
|
SetConsoleOutputCP(65001); // Codepage 65001 = UTF-8
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Kompiler-Flag setzen
|
||||||
|
|
||||||
|
```cmd
|
||||||
|
cl /utf-8 main.c ...
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Terminal unterstützen lassen
|
||||||
|
|
||||||
|
- `cmd.exe`: nur begrenzt tauglich
|
||||||
|
- **Windows Terminal**: beste Wahl
|
||||||
|
- PowerShell (v7+) ebenfalls ok
|
||||||
|
|
||||||
|
### 4. Schriftart beachten
|
||||||
|
|
||||||
|
- Monospace + Unicode-fähig: `Cascadia Code`, `Segoe UI Emoji`, `Fira Code`
|
||||||
|
|
||||||
|
## Hinweis
|
||||||
|
|
||||||
|
- Auch Eingabe (`SetConsoleCP`) kann auf UTF-8 gesetzt werden, wird aber selten benötigt
|
51
doc/winapi_notes.md
Normal file
51
doc/winapi_notes.md
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
# WIN32_FIND_DATA – Strukturreferenz (Windows API)
|
||||||
|
|
||||||
|
Diese Struktur wird verwendet, um Dateiinformationen aus `FindFirstFile` und `FindNextFile` zu lesen.
|
||||||
|
|
||||||
|
## Definition (verkürzt)
|
||||||
|
|
||||||
|
```c
|
||||||
|
typedef struct _WIN32_FIND_DATA {
|
||||||
|
DWORD dwFileAttributes;
|
||||||
|
FILETIME ftCreationTime;
|
||||||
|
FILETIME ftLastAccessTime;
|
||||||
|
FILETIME ftLastWriteTime;
|
||||||
|
DWORD nFileSizeHigh;
|
||||||
|
DWORD nFileSizeLow;
|
||||||
|
TCHAR cFileName[MAX_PATH];
|
||||||
|
TCHAR cAlternateFileName[14];
|
||||||
|
} WIN32_FIND_DATA;
|
||||||
|
```
|
||||||
|
|
||||||
|
## Wichtige Felder
|
||||||
|
|
||||||
|
| Feld | Typ | Beschreibung |
|
||||||
|
|-----------------------|----------|----------------------------------------------|
|
||||||
|
| `dwFileAttributes` | `DWORD` | Dateiattribute, z. B. `FILE_ATTRIBUTE_DIRECTORY` |
|
||||||
|
| `ftCreationTime` | `FILETIME` | Erstellungszeit |
|
||||||
|
| `ftLastWriteTime` | `FILETIME` | Letzte Änderung |
|
||||||
|
| `nFileSizeHigh` | `DWORD` | Dateigröße (oberer 32-Bit-Wert) |
|
||||||
|
| `nFileSizeLow` | `DWORD` | Dateigröße (unterer 32-Bit-Wert) |
|
||||||
|
| `cFileName` | `TCHAR[]`| Vollständiger Dateiname |
|
||||||
|
| `cAlternateFileName` | `TCHAR[]`| 8.3-Dateiname (DOS-kompatibel) |
|
||||||
|
|
||||||
|
## Beispiel
|
||||||
|
|
||||||
|
```c
|
||||||
|
WIN32_FIND_DATA find_data;
|
||||||
|
HANDLE hFind = FindFirstFile("C:\Beispiel\*", &find_data);
|
||||||
|
|
||||||
|
if (find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
|
||||||
|
printf("📁 %s\n", find_data.cFileName);
|
||||||
|
} else {
|
||||||
|
printf("📄 %s\n", find_data.cFileName);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Weitere Hinweise
|
||||||
|
|
||||||
|
- Wird ausschließlich unter Windows verwendet
|
||||||
|
- Maximaler Pfad ist `MAX_PATH` (260 Zeichen)
|
||||||
|
- Unicode-Unterstützung über `FindFirstFileW` möglich (für `WCHAR` statt `TCHAR`)
|
||||||
|
|
||||||
|
---
|
16
include/app.h
Normal file
16
include/app.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#ifndef APP_H
|
||||||
|
#define APP_H
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Recursively scans the specified directory and prints an ASCII tree.
|
||||||
|
*
|
||||||
|
* This function lists the contents of a directory, using indentation to represent
|
||||||
|
* folder structure. Folders are printed with 📁 and files with 📄 icons.
|
||||||
|
* Currently implemented for Windows systems only.
|
||||||
|
*
|
||||||
|
* @param base_path The root directory to scan
|
||||||
|
* @param depth Current recursion depth, used for visual indentation
|
||||||
|
*/
|
||||||
|
void scan_directory(const char *base_path, int depth);
|
||||||
|
|
||||||
|
#endif
|
55
src/app.c
Normal file
55
src/app.c
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#include <windows.h>
|
||||||
|
#else
|
||||||
|
#include <dirent.h> // for future POSIX support
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "app.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Implementation of recursive directory scanning using Windows API.
|
||||||
|
*
|
||||||
|
* Uses FindFirstFile and FindNextFile to enumerate folder contents.
|
||||||
|
* The current implementation supports only Windows platforms.
|
||||||
|
*
|
||||||
|
* @param base_path Root path to scan
|
||||||
|
* @param depth Recursion depth for indentation
|
||||||
|
*/
|
||||||
|
void scan_directory(const char *base_path, int depth) {
|
||||||
|
#ifdef _WIN32
|
||||||
|
WIN32_FIND_DATA find_data;
|
||||||
|
char search_path[MAX_PATH];
|
||||||
|
snprintf(search_path, MAX_PATH, "%s\\*", base_path);
|
||||||
|
|
||||||
|
HANDLE hFind = FindFirstFile(search_path, &find_data);
|
||||||
|
|
||||||
|
if (hFind == INVALID_HANDLE_VALUE) {
|
||||||
|
fprintf(stderr, "[ERROR] Zugriff auf %s fehlgeschlagen\n", base_path);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
do {
|
||||||
|
const char *name = find_data.cFileName;
|
||||||
|
if (strcmp(name, ".") == 0 || strcmp(name, "..") == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
for (int i = 0; i < depth; i++) printf(" ");
|
||||||
|
if (find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
|
||||||
|
printf("📁 %s\n", name);
|
||||||
|
char sub_path[MAX_PATH];
|
||||||
|
snprintf(sub_path, MAX_PATH, "%s\\%s", base_path, name);
|
||||||
|
scan_directory(sub_path, depth + 1);
|
||||||
|
} else {
|
||||||
|
printf("📄 %s\n", name);
|
||||||
|
}
|
||||||
|
|
||||||
|
} while (FindNextFile(hFind, &find_data) != 0);
|
||||||
|
|
||||||
|
FindClose(hFind);
|
||||||
|
#else
|
||||||
|
fprintf(stderr, "[WARN] POSIX-Verzeichnisscan ist noch nicht implementiert\n");
|
||||||
|
#endif
|
||||||
|
}
|
28
src/main.c
Normal file
28
src/main.c
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
#ifdef _WIN32
|
||||||
|
#include <windows.h>
|
||||||
|
#endif
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "app.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Entry point of the CLI tool.
|
||||||
|
*
|
||||||
|
* Initializes UTF-8 output on Windows, then calls scan_directory()
|
||||||
|
* with the provided argument or current directory.
|
||||||
|
*
|
||||||
|
* @param argc Number of arguments
|
||||||
|
* @param argv Array of argument strings
|
||||||
|
* @return int Exit status
|
||||||
|
*/
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
#ifdef _WIN32
|
||||||
|
SetConsoleOutputCP(CP_UTF8); // Enable Unicode output on Windows
|
||||||
|
#endif
|
||||||
|
|
||||||
|
printf("[INFO] CLI Tool gestartet\n");
|
||||||
|
|
||||||
|
const char *pfad = (argc > 1) ? argv[1] : ".";
|
||||||
|
scan_directory(pfad, 0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user