使用go命令可以定位到文件頭和文件末
創(chuàng)新互聯(lián)建站主要從事成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)民豐,十年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575
當(dāng)go run 運(yùn)行時會將文件轉(zhuǎn)移到臨時路徑下,然后再進(jìn)行編譯和執(zhí)行,分片0就是C:\Users\xxx\AppData\Local\Temp___go_build_main_go.exe;
go build編譯執(zhí)行時,那么分片0為執(zhí)行文件的相對路徑為(main.go)
fmt.Println(os.Args)
//output:[C:\Users\xxx\AppData\Local\Temp\___go_build_main_go.exe]
1
2
1
2
exec.LookPath()
根據(jù)傳入的參數(shù)來從PATH中獲取可執(zhí)行文件的絕對路徑(沒有編譯的)或者相對路徑(編譯后的);參數(shù)若帶分割號就直接查詢返回
func LookPath(file string) (string, error)
LookPath searches for an executable named file in the directories named by the
PATH environment variable. If file contains a slash, it is tried directly and the
PATH is not consulted. LookPath also uses PATHEXT environment variable to match a
suitable candidate. The result may be an absolute path or a path relative to the
current directory.
1
2
3
4
5
6
7
1
2
3
4
5
6
7
filepath.Abs()
根據(jù)傳入的路徑計(jì)算出絕對路徑,如果傳入的為相對路徑,那么它會把當(dāng)前路徑拼接上
編譯后返回的是真實(shí)的路徑(D:\go_project\src\github.com\wzbwzt\studyGo\GetPath\main.exe)
未編譯執(zhí)行返回的是臨時執(zhí)行路徑
(C:\Users\xxx\AppData\Local\Temp___go_build_main_go.exe)
本文主要介紹了Go語言中文件讀寫的相關(guān)操作。
文件是什么?
計(jì)算機(jī)中的文件是存儲在外部介質(zhì)(通常是磁盤)上的數(shù)據(jù)集合,文件分為文本文件和二進(jìn)制文件。
os.Open() 函數(shù)能夠打開一個文件,返回一個 *File 和一個 err 。對得到的文件實(shí)例調(diào)用 close() 方法能夠關(guān)閉文件。
為了防止文件忘記關(guān)閉,我們通常使用defer注冊文件關(guān)閉語句。
Read方法定義如下:
它接收一個字節(jié)切片,返回讀取的字節(jié)數(shù)和可能的具體錯誤,讀到文件末尾時會返回 0 和 io.EOF 。 舉個例子:
使用for循環(huán)讀取文件中的所有數(shù)據(jù)。
bufio是在file的基礎(chǔ)上封裝了一層API,支持更多的功能。
io/ioutil 包的 ReadFile 方法能夠讀取完整的文件,只需要將文件名作為參數(shù)傳入。
os.OpenFile() 函數(shù)能夠以指定模式打開文件,從而實(shí)現(xiàn)文件寫入相關(guān)功能。
其中:
name :要打開的文件名 flag :打開文件的模式。 模式有以下幾種:
perm :文件權(quán)限,一個八進(jìn)制數(shù)。r(讀)04,w(寫)02,x(執(zhí)行)01。
golang ioutil.WriteFile函數(shù)perm參數(shù)的用法
ioutil.WriteFile(..., perm os.FileMode)
剛開始接觸golang的文件API的時候,總是納悶為什么在創(chuàng)建文件的時候需要顯示的指定文件的perm屬性,難道不能從系統(tǒng)的umask里面獲取嗎?
實(shí)際上ioutil.WriteFile在創(chuàng)建新文件時,并不是直接使用參數(shù)perm的值,而是要和umask的值做合并的。把函數(shù)參數(shù)的值合并到當(dāng)前umask的值,才是最終創(chuàng)建出來文件的perm屬性。
例如
umask為空,所以ioutil.WriteFile的perm屬性就是最后的文件屬性
umask為0777,所以ioutil.WriteFile的perm屬性全被disable掉了
umask為0000,所以ioutil.WriteFile的perm屬性就是最后的文件屬性
umask為0640,而ioutil.WriteFile的perm屬性也是640,正好全部被關(guān)閉了,最后生成的文件沒有任何屬性。
即ioutil.WriteFile在寫文件時,如果目標(biāo)文件已經(jīng)存在,那么目標(biāo)文件的perm屬性不會被改動,即此時ioutil.WriteFile的參數(shù)perm會被忽略。
注意一點(diǎn)就明白了,touch命令使用的是0666的屬性,它并沒有給X(executable)屬性置值,所以不管在umask中對executable位是否置1,touch命令就不能生成一個具有executable的文件。
003-golang 調(diào)用外部命令
相關(guān)函數(shù)
exec包執(zhí)行外部命令,它將os.StartProcess進(jìn)行包裝使得它更容易映射到stdin和stdout,并且利用pipe連接i/o.
func LookPath(file string) (string, error) //LookPath在環(huán)境變量中查找科執(zhí)行二進(jìn)制文件,如果file中包含一個斜杠,則直接根據(jù)絕對路徑或者相對本目錄的相對路徑去查找
在用exec包調(diào)用的其他進(jìn)程后如何關(guān)閉結(jié)束,可以使用context包的機(jī)制進(jìn)行管理,context包的使用詳見:
exec.CommandContext方發(fā)實(shí)現(xiàn)了context,通過context可以對exec啟動的進(jìn)程結(jié)束。
隱藏程序自身黑窗口的方法:go build -ldflags="-H windows"
隱藏子進(jìn)程黑窗口的方法: