cpp

Указание пути к файлу

Путь, указываемый при открытии файла, может быть абсолютным или относительным. При указании абсолютного пути следует учитывать, что слэш является специальным символом. По этой причине его необходимо удваивать. Пример:

fmt.Println("C:\\temp\\new\\file.txt") // C:\temp\new\file.txt

Если вместо двух слэшей использовать только один, то в пути будут присутствовать сразу три специальных символа: \t, \n и \f. После преобразования специальных символов путь будет выглядеть следующим образом:

C:<Табуляция>emp<Перевод строки>ew<Перевод формата>ile.txt

Для указания пути можно также использовать строки в обратных кавычках. В этом случае экранировать слэш не нужно:

fmt.Println(`C:\temp\new\file.txt`) // C:\temp\new\file.txt

Вместо абсолютного пути к файлу можно указать относительный путь. В этом случае путь определяется с учетом местоположения текущего рабочего каталога. Обратите внимание на то, что текущий рабочий каталог не всегда совпадает с каталогом, в котором находится исполняемый файл. Если файл запускается из командной строки, то текущим рабочим каталогом будет каталог, из которого запускается файл. Получить строковое представление текущего рабочего каталога позволяет функция Getwd() из пакета os:

os.Getwd() (dir string, err error)

Вернуть абсолютный путь с учетом текущего рабочего каталога позволяет функция Abs() из пакета path/filepath. Формат функции:

filepath.Abs(path string) (string, error)

Пример:

fmt.Println(os.Getwd())
fmt.Println(filepath.Abs(`test.txt`))

Запустим программу из командной строки разными способами:

C:\book\test>go run main.go
C:\book\test <nil>
C:\book\test\test.txt <nil>

C:\book\test>cd ..

C:\book>go run test\main.go
C:\book <nil>
C:\book\test.txt <nil>

Чтобы не зависеть от текущего рабочего каталога, следует воспользоваться функцией Executable(), которая возвращает путь и название исполняемого файла. Формат функции:

os.Executable() (string, error)

Обратите внимание: функция Executable() может вернуть символическую ссылку. Вполне возможно потребуется дополнительно воспользоваться функцией EvalSymlinks() из пакета path/filepath. Формат функции:

filepath.EvalSymlinks(path string) (string, error)

Изменить текущий рабочий каталог можно с помощью функции Chdir() из пакета os. Формат функции:

os.Chdir(dir string) error

Создадим путь относительно каталога с исполняемым файлом:

p, err := os.Executable()
if err != nil {
   fmt.Println(err)
   return
}
fmt.Println(os.Getwd())
fmt.Println(os.Chdir(filepath.Dir(p)))
fmt.Println(os.Getwd())
fmt.Println(filepath.Abs(`test.txt`))
fmt.Println(filepath.Join(filepath.Dir(p), `test.txt`))

Запустим программу из командной строки разными способами:

C:\book\test>go run main.go
C:\book\test <nil>
<nil>
C:\Users\Unicross\AppData\Local\Temp\go-build1993054092\b001\exe <nil>
C:\Users\Unicross\AppData\Local\Temp\go-build1993054092\b001\exe\test.txt
<nil>
C:\Users\Unicross\AppData\Local\Temp\go-build1993054092\b001\exe\test.txt

C:\book\test>go build main.go

C:\book\test>main.exe
C:\book\test <nil>
<nil>
C:\book\test <nil>
C:\book\test\test.txt <nil>
C:\book\test\test.txt

C:\book\test>cd ..

C:\book>test\main.exe
C:\book <nil>
<nil>
C:\book\test <nil>
C:\book\test\test.txt <nil>
C:\book\test\test.txt

Возможны следующие варианты указания относительного пути в Windows:

  • если открываемый файл находится в текущем рабочем каталоге, то можно указать только название файла или перед названием файла добавить одну точку и прямой или обратный слэш:
fmt.Println(filepath.Abs(`file.txt`))
// C:\book\test\file.txt <nil>
fmt.Println(filepath.Abs(`./file.txt`))
// C:\book\test\file.txt <nil>
fmt.Println(filepath.Abs(`.\file.txt`))
// C:\book\test\file.txt <nil>
  • если открываемый файл расположен во вложенном каталоге, то перед названием файла перечисляются названия вложенных каталогов через прямой или обратный слэш:
fmt.Println(filepath.Abs(`f1\file.txt`))
// C:\book\test\f1\file.txt <nil>
fmt.Println(filepath.Abs(`f1/file.txt`))
// C:\book\test\f1\file.txt <nil>
fmt.Println(filepath.Abs(`f1\f2\file.txt`))
// C:\book\test\f1\f2\file.txt <nil>
fmt.Println(filepath.Abs(`./f1/f2/file.txt`))
// C:\book\test\f1\f2\file.txt <nil>
  • если каталог с файлом расположен выше уровнем, то перед названием файла указываются две точки и прямой или обратный слэш:
fmt.Println(filepath.Abs(`..\file.txt`))
// C:\book\file.txt <nil>
fmt.Println(filepath.Abs(`../file.txt`))
// C:\book\file.txt <nil>
fmt.Println(filepath.Abs(`..\..\file.txt`))
// C:\file.txt <nil>
fmt.Println(filepath.Abs(`../../file.txt`))
// C:\file.txt <nil>
  • если в начале пути расположен слэш, то путь отсчитывается от корня текущего диска. В этом случае местоположение текущего рабочего каталога не имеет значения. Пример:
fmt.Println(filepath.Abs(`\book\test\file.txt`))
// C:\book\test\file.txt <nil>
fmt.Println(filepath.Abs(`/book/test/file.txt`))
// C:\book\test\file.txt <nil>

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp