Skip to content
Snippets Groups Projects
Commit 9050a491 authored by Hilde Jordal's avatar Hilde Jordal
Browse files

student code v3

parent b8d43667
No related branches found
No related tags found
No related merge requests found
......@@ -6,6 +6,8 @@ I denne oppgaven får dere utlevert kode som simulerer et enkelt filsystem. Kjø
Filsystemet er som helhet lagret i en fil ``myfilesystem.fs`` og er delt inn i blokker. Den første blokken har headerinformasjon om filsystemet, og resten er blokker brukt til filinnhold. Les kommentarer og dokumentasjon i koden for å forstå koden bedre. Det er også mulig å åpne filsystemet som rå data ved å bruke kommando ``xxd myfilesystem.fs`` i terminal. Da vil du se en oversikt over filsystemet i hexadesimalt format.
I ``main.py`` er det lagt til noen tester du kan kjøre etter hver oppgave for å sjekke om koden din fungerer som forventet.
## Oppgave 1: Bedre bruk av frie blokker
Forsøk å forstå hvordan ``save()`` bestemmer hvor en ny fil skal lagres. Tenk over hvorfor dette ikke er ideelt med tanke på at filer kan slettes. Endre koden slik at den alltid finner den første tilgjengelige blokken å skrive til. Dette bør fungere i samspill med ``remove()``, som sletter filer. Pass på at du fortsatt får samme feilmelding dersom du ikke har plass til å lagre flere filer.
......@@ -22,7 +24,7 @@ Siden `load()` nå leser bare eksakt det innholdet som er lagret i en fil og ikk
## Oppgave 4: hard_link()
Vi har gitt filsystemet en hel blokk til headerinformasjon. Der lagres filnavnene og størrelsene som vi har brukt så langt. Men vi har ikke nok blokker til å fylle den fullstendig med file entries. Med den resterende plassen skal vi tillate å lage hard links til eksisterende filer.
Vi har gitt filsystemet en hel blokk til headerinformasjon. Der lagres filnavnene og størrelsene på filene. Men vi har ikke nok blokker til å fylle den fullstendig med file entries. Med den resterende plassen skal vi tillate å lage hard links til eksisterende filer. Altså, en hard link skal kun plasseres som en entry under maks antall filer i headeren.
### Del A
Implementer ``hard_link(f, existing_file, linked_file)``. Funksjonen skal lage en ny file entry som peker til en eksisterende fil. Med andre ord, funksjonen skal lage en hard link.
......@@ -36,10 +38,4 @@ Oppdater `load()` slik at den kan lese innholdet fra en hard link.
Oppdater `remove()` slik:
- Hvis `remove()` blir kallet for en fil, skal filens originale file entry erstattes av den øverste hard linken som peker til filen. Hvis det ikke finnes noen slike hard linker, skal filen slettes.
- Hvis `remove()` blir kallet for en hard link, skal hard linken slettes.
- Husk å bruke `NoFile` som exception når filnavnet ikke finnes hverken som fil eller link.
## change log
- changed find_fileno so it uses FILENAME_SIZE from the start, so not needed to change in student task
- added error for save() if no space is available which is used in save() to begin with.
- added error to remove() if file not found
- Made it so errors are not caught in the file system, such that the student can see the error messages and they can be checked in unit tests.
\ No newline at end of file
- Husk å bruke `NoFile` som exception når filnavnet ikke finnes hverken som fil eller link.
\ No newline at end of file
from myfs import format, save, load, copy, remove
from myfs import format, save, load, copy, remove, hard_link, NoFile
import sys
if len(sys.argv) < 2:
......@@ -25,6 +25,80 @@ it, 'and what is the use of a book,' thought Alice 'without pictures or
conversations?'
"""
test_sample = "Did you know that the moon is made of cheese?"
def test_1():
with open("test1.fs", 'r+b') as f:
format(f) # clear the file system
try:
for i in range(7):
# Add 7 files (is max with the original capacity)
save(f, f"alice{i}.txt", f"content{i}")
# Remove 1 file, there should be more space now
remove(f, f"alice{i}.txt")
# try adding another file
save(f, f"hello.txt", f"Hello World!")
# Check that the new file is there
assert load(f, "hello.txt") == "Hello World!"
except Exception as e:
print(f"Test 1 failed: {e}")
def test_2():
# Test with a file that has null bytes
with open("test_null_bytes.fs", 'w+b') as f:
format(f)
save(f, "test.txt", f"{test_sample}\0\0\0")
content = load(f, "test.txt")
assert content == f"{test_sample}\0\0\0"
# Test that other content is also loaded correctly
with open("test_save_with_file_size.fs", 'w+b') as f:
format(f)
save(f, "test.txt", test_sample)
content = load(f, "test.txt")
assert content == test_sample
def test_3():
# test that block was not zeroed out when deleted
with open("test_remove_not_zeroed_out.fs", 'w+b') as f:
format(f)
save(f, "test.txt", test_sample)
remove(f, "test.txt")
# Check that the file system is not fully zeroed out
f.seek(0)
content = f.read()
assert any(byte != 0 for byte in content), "File system is fully zeroed out after removal"
def test_4():
with open("test_hard_link.fs", 'w+b') as f:
format(f)
save(f, "test.txt", test_sample)
# Test that you can save a hard link
hard_link(f, "test.txt", "link.txt")
# Test that the content is the same
content = load(f, "link.txt")
assert content == test_sample
# Test that removing the original file does not affect the hard link
remove(f, "test.txt")
content = load(f, "link.txt")
assert content == test_sample
# test that the file can be removed
remove(f, "link.txt")
try:
load(f, "link.txt")
except NoFile:
pass
else:
raise AssertionError("Test 4 failed: File was not removed")
print()
print("*" * 60)
......@@ -32,15 +106,7 @@ print(f"* Use xxd {backingfile} to inspect contents")
print("*" * 60)
print()
with open(backingfile, 'r+b') as f:
format(f)
save(f, "hello.txt", "Hello")
save(f, "alice.txt", alice_sample)
alice_back = load(f, "alice.txt")
print(alice_back)
copy(f, "hello.txt", "clone.txt")
save(f, "bye.txt", "Bye Bye")
copy(f, "hello.txt", "clone2.txt")
remove(f, "bye.txt")
\ No newline at end of file
#test_1()
#test_2()
#test_3()
#test_4()
......@@ -135,6 +135,11 @@ def remove(f, filename):
f.seek(HEADER_START + FILE_ENTRY_SIZE * (fileno+1))
f.write(b'\0' * FILE_ENTRY_SIZE)
# update number of files
num_existing = _get_num_files(f)
_set_num_files(f, num_existing - 1)
def hard_link(f, existing_file, link_name):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment