Unbewohnte
3 years ago
12 changed files with 238 additions and 6 deletions
@ -0,0 +1,93 @@
|
||||
package fs |
||||
|
||||
import ( |
||||
"fmt" |
||||
"os" |
||||
"path/filepath" |
||||
) |
||||
|
||||
// A struct that represents the main information about a directory
|
||||
type Directory struct { |
||||
Name string |
||||
Path string |
||||
ParentPath string |
||||
Files []*File |
||||
Directories []*Directory |
||||
} |
||||
|
||||
var ErrorNotDirectory error = fmt.Errorf("not a directory") |
||||
|
||||
func GetDir(path string, recursive bool) (*Directory, error) { |
||||
fmt.Println("Provided path ", path) |
||||
|
||||
absPath, err := filepath.Abs(path) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
fmt.Println("absolute path ", absPath) |
||||
|
||||
stats, err := os.Stat(absPath) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
// check if it is a directory for real
|
||||
if !stats.IsDir() { |
||||
return nil, ErrorNotDirectory |
||||
} |
||||
|
||||
// loop through each entry in the directory
|
||||
entries, err := os.ReadDir(absPath) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
var innerDirs []*Directory |
||||
var innerFiles []*File |
||||
for _, entry := range entries { |
||||
entryInfo, err := entry.Info() |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
if entryInfo.IsDir() { |
||||
if recursive { |
||||
// do the recursive magic
|
||||
innerDirPath := filepath.Join(absPath, entry.Name()) |
||||
|
||||
fmt.Println("inner dir path ", innerDirPath) |
||||
|
||||
innerDir, err := GetDir(innerDirPath, true) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
innerDirs = append(innerDirs, innerDir) |
||||
} |
||||
// if not - skip the directory
|
||||
|
||||
} else { |
||||
innerFilePath := filepath.Join(absPath, entryInfo.Name()) |
||||
|
||||
fmt.Println("inner file path ", innerFilePath) |
||||
|
||||
innerFile, err := GetFile(innerFilePath) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
innerFiles = append(innerFiles, innerFile) |
||||
} |
||||
} |
||||
|
||||
directory := Directory{ |
||||
Name: stats.Name(), |
||||
Path: absPath, |
||||
ParentPath: filepath.Dir(absPath), |
||||
Directories: innerDirs, |
||||
Files: innerFiles, |
||||
} |
||||
|
||||
return &directory, nil |
||||
} |
@ -0,0 +1,26 @@
|
||||
package fs |
||||
|
||||
import "testing" |
||||
|
||||
func Test_GetDir(t *testing.T) { |
||||
dirpath := "../testfiles/" |
||||
|
||||
_, err := GetDir(dirpath, false) |
||||
if err != nil { |
||||
t.Fatalf("GetDir error: %s", err) |
||||
} |
||||
} |
||||
|
||||
func Test_GetDirRecursive(t *testing.T) { |
||||
dirpath := "../testfiles/" |
||||
|
||||
dir, err := GetDir(dirpath, true) |
||||
if err != nil { |
||||
t.Fatalf("GetDir error: %s", err) |
||||
} |
||||
|
||||
expectedAmountOfUpperDirectories := 2 |
||||
if len(dir.Directories) != expectedAmountOfUpperDirectories { |
||||
t.Fatalf("GetDir error: expected to have %d inner directories; got %d", expectedAmountOfUpperDirectories, len(dir.Directories)) |
||||
} |
||||
} |
@ -0,0 +1,43 @@
|
||||
package fs |
||||
|
||||
import ( |
||||
"fmt" |
||||
"os" |
||||
"path/filepath" |
||||
) |
||||
|
||||
// A struct that represents the main file information
|
||||
type File struct { |
||||
Name string |
||||
Path string |
||||
ParentPath string |
||||
Size uint64 |
||||
} |
||||
|
||||
var ErrorNotFile error = fmt.Errorf("not a file") |
||||
|
||||
func GetFile(path string) (*File, error) { |
||||
absPath, err := filepath.Abs(path) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
stats, err := os.Stat(absPath) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
// check if it is a directory
|
||||
if stats.IsDir() { |
||||
return nil, ErrorNotFile |
||||
} |
||||
|
||||
file := File{ |
||||
Name: stats.Name(), |
||||
Path: absPath, |
||||
ParentPath: filepath.Dir(absPath), |
||||
Size: uint64(stats.Size()), |
||||
} |
||||
|
||||
return &file, nil |
||||
} |
@ -0,0 +1,16 @@
|
||||
package fs |
||||
|
||||
import "testing" |
||||
|
||||
func Test_GetFile(t *testing.T) { |
||||
filepath := "../testfiles/testfile.txt" |
||||
|
||||
file, err := GetFile(filepath) |
||||
if err != nil { |
||||
t.Fatalf("GetFile error: %s", err) |
||||
} |
||||
|
||||
if file.Name != "testfile.txt" { |
||||
t.Fatalf("GetFile error: filenames do not match") |
||||
} |
||||
} |
@ -0,0 +1,7 @@
|
||||
package node |
||||
|
||||
|
||||
// Server and a client in one type !
|
||||
type Node struct { |
||||
|
||||
} |
@ -0,0 +1,9 @@
|
||||
package node |
||||
|
||||
// Implementation for sender and receiver node
|
||||
type Noder interface { |
||||
Connect(addr string, port uint) error |
||||
Disconnect() error |
||||
Listen(dataPipe chan []byte) |
||||
Send(data []byte) error |
||||
} |
@ -0,0 +1,9 @@
|
||||
testfile3 |
||||
|
||||
|
||||
SAMPLE TEXT |
||||
|
||||
lCtrl + Lshift + u |
||||
15dc 2ec 15dc |
||||
|
||||
not on Windows tho AFAIK |
@ -0,0 +1,9 @@
|
||||
testfile2 |
||||
|
||||
|
||||
|
||||
there are no buses |
||||
in Gensokyo btw (9) |
||||
|
||||
|
||||
yeah... |
@ -0,0 +1,3 @@
|
||||
testfile4 |
||||
|
||||
*something smart and philosophic* |
Loading…
Reference in new issue