檔案系統:介面

檔案位置指標(file position pointer)

想像你讀書時用手指停在下一個字底下。每讀一個字,手指就往前滑;如果你想往後跳,就把手指抬起來放到別處。檔案位置指標就是作業系統在你已開啟檔案中的那根手指:它標記著下一次讀或寫會發生在哪個位元組。

當你開啟檔案時,這個指標從 0 開始,也就是最開頭的位元組。每一次讀或寫 n 個位元組,指標就前進 n,所以一連串的讀取自然會從頭到尾走過整個檔案,而你什麼都不必追蹤。定位(seek)操作讓你把手指抬起、放到任何指定的偏移量:定位到 0 是倒帶、定位到結尾是附加、定位到第 5000 個位元組是直接跳到中間。關鍵在於:這個指標是和檔案的一次「開啟」綁定的,而不是和檔案本身綁定——作業系統把它存在你的描述符所通往的共享開啟檔案結構裡。這就是為什麼把同一個檔案開啟兩次會得到兩個獨立的位置,而複製一個描述符(讓兩個代號共享同一次開啟)則會讓它們共用單一的位置。

為什麼重要:位置指標把一個扁平的位元組陣列,變成你可以串流走過、或跳來跳去的東西,而它正是「為什麼讀取會持續回傳下一段、而不是一遍又一遍回傳同樣位元組」背後那個隱藏的狀態。一個經典錯誤就出在忘了它:寫入資料之後,你必須先定位回 0,才能讀到你剛剛寫的東西,否則指標停在結尾,你的讀取會什麼都讀不到。

開啟一個檔案,read(fd, buf, 10):你得到第 0 到 9 個位元組,而位置現在是 10。再讀一次會得到第 10 到 19 個位元組。要從頭重讀,得先定位回 0。

讀寫會推進指標;seek 能把它移到任何地方。

位置屬於一次「開啟」,不屬於檔案。兩次獨立的開啟有各自獨立的位置;寫入後要先定位到 0 再讀,否則你會從結尾讀起、什麼也讀不到。

又稱
file offsetcurrent file position檔案偏移量讀寫位置