Функция os.SameFile

Функция os.SameFile проверяет, ссылаются ли два переданных ей файловых дескриптора на один и тот же базовый файл. Она возвращает true, если оба дескриптора указывают на один и тот же файл, и false в противном случае. Первым параметром функция принимает файловую информацию os.FileInfo, полученную от первого файла, вторым параметром - файловую информацию, полученную от второго файла.

Синтаксис

goos.SameFile(fi1, fi2 os.FileInfo) bool

Пример

Давайте проверим, указывают ли два дескриптора на один и тот же файл:

gopackage main

import (
  "fmt"
  "os"
)

func main() {
  // Получаем информацию о файле из разных источников
  file1, err := os.Open("example.txt")
  if err != nil {
    fmt.Println("Error opening file1:", err)
    return
  }
  defer file1.Close()

  file2, err := os.Open("example.txt")
  if err != nil {
    fmt.Println("Error opening file2:", err)
    return
  }
  defer file2.Close()

  // Получаем информацию о каждом файле
  fi1, err := file1.Stat()
  if err != nil {
    fmt.Println("Error getting file1 info:", err)
    return
  }

  fi2, err := file2.Stat()
  if err != nil {
    fmt.Println("Error getting file2 info:", err)
    return
  }

  // Проверяем, указывают ли они на один и тот же файл
  res := os.SameFile(fi1, fi2)
  fmt.Println(res)
}

Результат выполнения кода:

gotrue

Пример

Давайте проверим два разных файла с одинаковым содержимым:

gopackage main

import (
  "fmt"
  "os"
)

func main() {
  // Создаем два разных файла с одинаковым содержимым
  file1, err := os.Create("file1.txt")
  if err != nil {
    fmt.Println("Error creating file1:", err)
    return
  }
  defer file1.Close()
  file1.WriteString("Hello, World!")

  file2, err := os.Create("file2.txt")
  if err != nil {
    fmt.Println("Error creating file2:", err)
    return
  }
  defer file2.Close()
  file2.WriteString("Hello, World!")

  // Получаем информацию о каждом файле
  fi1, err := file1.Stat()
  if err != nil {
    fmt.Println("Error getting file1 info:", err)
    return
  }

  fi2, err := file2.Stat()
  if err != nil {
    fmt.Println("Error getting file2 info:", err)
    return
  }

  // Проверяем, указывают ли они на один и тот же файл
  res := os.SameFile(fi1, fi2)
  fmt.Println(res)
}

Результат выполнения кода:

gofalse

Пример

Давайте проверим, указывают ли обычный файл и жесткая ссылка на него на один и тот же файл:

gopackage main

import (
  "fmt"
  "os"
)

func main() {
  // Создаем файл и жесткую ссылку на него
  err := os.WriteFile("original.txt", []byte("test content"), 0644)
  if err != nil {
    fmt.Println("Error creating original file:", err)
    return
  }

  err = os.Link("original.txt", "hardlink.txt")
  if err != nil {
    fmt.Println("Error creating hardlink:", err)
    return
  }

  // Получаем информацию об оригинальном файле и жесткой ссылке
  fi1, err := os.Stat("original.txt")
  if err != nil {
    fmt.Println("Error getting original file info:", err)
    return
  }

  fi2, err := os.Stat("hardlink.txt")
  if err != nil {
    fmt.Println("Error getting hardlink info:", err)
    return
  }

  // Проверяем, указывают ли они на один и тот же файл
  res := os.SameFile(fi1, fi2)
  fmt.Println(res)
}

Результат выполнения кода:

gotrue

Смотрите также

  • функцию os.Stat,
    которая возвращает информацию о файле или директории
  • функцию os.Lstat,
    которая возвращает информацию о файле без перехода по символической ссылке
  • функцию os.File.Stat,
    которая возвращает информацию о текущем открытом файле
  • функцию os.IsNotExist,
    которая проверяет, существует ли файл