一個Windows應用程序,例如大型遊戲,除了exe文件外,其餘的文件都是些什麼文件?有什麼內容?

一個應用程序安裝後往往有幾十個上百個文件,這些文件大多數都是什麼用途?裡面一般是什麼內容?以遊戲為例,除了遊戲中用到的貼圖等資源外,剩下的部分都有什麼用途?


exe只是一個入口文件,當然,其他的dll文件或者一些你不知道的格式文件,他們包含的東西很多,比如大部分的dll文件,他和exe文件的區別在於,dll文件只提供處理的方法,exe是去執行這些dll的。
打個比方,你要執行一個數據加密,但你不會寫加密演算法,恰好你在網上找到一個提供加密演算法的dll,你就寫一個exe,然後來調用那個dll,執行你的加密過程,你完全可以不需要了解加密是如何執行的,你只需要調用別人提供的dll就可以實現了。
你說的exe 其實和dll沒什麼區別,只是,普通人認為exe可以執行,而dll文件和其他文件不能執行而已。其實exe和dll 都是可執行文件,只是exe是提供給用戶執行的,dll文件是給程序執行的。

還有一些你看到的什麼dat,ini,xml等文件,這些就屬於數據文件,文件的後綴並不代表文件的類型,我程序調用一張圖片,我可以取名叫「picture.dll」 但它也能被當作圖片處理,文件的後綴,只是方便操作系統去識別的,但在程序里,軟體只會識別文件的流是不是能被轉化成圖片或者其他文件類型,不同程序,或者說不同遊戲下,dat文件不代表就是同一種文件,只是看你程序如何處理而已,格式都是程序員自己定的。

總結來說,exe是給用戶一個入口文件,exe可以是有窗體的,也可以是沒有窗體的程序,exe負責去調用各種不同的dll和資源文件,dll也可以去調用其它不同的dll和資源文件,然後exe或者dll去處理數據,呈現給用戶一個GUI界面去操作。
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
用比喻來說 :
以演唱會為例子:
比如你是去看陳奕迅演唱會,陳奕迅好比是exe可執行文件。
你們關注的是陳奕迅,也就是普通人要執行軟體,首先去找exe後綴的文件。
但演唱會有很多元素,配樂,音響:可以理解為dll文件,
燈光,舞台等等理解為資源文件。
配樂,音響,燈光,舞台等等,這些不是你們主要關注的對象,他們只是輔助陳奕迅演唱會順利進行的配角,他們就理解為各種資源和各種庫。
執行exe文件,就代表演唱會開始,然後需要用到各種各樣的配角去配合完成演唱會,exe文件就去調用需要的dll,比如,(配樂.dll),執行"配樂.dll",可以開始播放背景音樂,調用燈光.gif,就可以呈現出各種各樣的光效,但燈光.gif 由誰來調用呢?陳奕迅不會去操控燈光(但程序里可以exe去調用,也可以交給外部dll去調用,但與其讓陳奕迅去學會操控燈效,不如請個燈效師,也就是燈光開始.dll這個燈效師),所以這時候有個燈光開始.dll就可以去控制燈光.....(省略500字)

所以打包下來,就是以下幾個東西:
陳奕迅.exe
電源.dll
配樂.dll

燈光.gif
燈光開始.dll
安保.dll
演出服裝.png
...............................
但有些時候,我們覺得,dll文件這麼多,會不會很冗餘,所以我們辭掉了燈效師和控制電源的兩個人,然後請了一個既會控制電源,又會操控燈效的人。(把兩個dll合併成一個,就有一個power.dll,演唱會開始了後,我發出命令,power.dll,幫我打開舞台的電源,然後power就會打開舞台電源,然後你再叫他給我配合一下燈效,他就會幫你打燈效)


一場演出下來,我們只會去關注陳奕迅他怎麼表演,但其他的舞台效果,各種後台工作人員,就是各種dll和資源文件。
這下比喻清楚了吧,還不清楚我就沒辦法了,書讀的少,不怎麼會表達。。。


引擎不一定都在exe里,有部分可以放在DLL里(比如要和編輯器共享),另外需要用到的庫(zlib啊,bink啊)可能也在DLL里
圖形數據,3D的話一般有模型,貼圖(一般還有各種大小精度滿足不同配置需求),骨骼動畫
腳本,可以是lua或者其他語言
關卡數據(NPC啊,場景設置,引擎動畫啊什麼的),這個格式完全取決於引擎
預渲染過場動畫和音樂
以上所有除了exe和DLL一般都會壓縮打包,所以也有可能你只能看到幾個打包後的壓縮文件


以子彈風暴和Braid這兩個遊戲為例,看看我硬碟上的子彈風暴

雖然有這麼多文件夾,其實可以刪掉很多,遊戲照樣能玩的。當然有幾個不能刪的:
Engine是圖形引擎(3D引擎),一般3D遊戲都會用現有的引擎,或者自己開發個引擎也行。Shaders裡面是著色器,用這些文件保存了屏幕上圖形、顏色等的渲染規則。
Binaries,這是肯定不能少的。裡面有exe,dll,作用樓上都說得很清楚了,而寫著Microsoft字樣的文件夾,裡面有Visual Studio 2010運行所需的類庫(就像你播放視頻也要先安裝Flash播放器一樣!) PhysX下面的是NVIDIA的驅動程序。 那麼如果你的顯卡不是NVIDIA顯卡呢?照樣有這個文件!因為一個大型遊戲實際上用到了很多個廠商的技術,NVIDIA在這裡提供了這個遊戲的一部分圖形技術。在他們自己的顯卡上會運行得流暢一些,別的卡也能跑!
StormGame下面包括了玩家的選項配置、過場動畫等等,刪掉了也能玩,程序會重新生成一份配置,而遇到過場動畫就跳過就行了! Splash這個文件夾,下面只有兩張圖片,這種一般是遊戲剛啟動的時候所顯示的圖片,因為這時候一般不會進到數據文件裡面載入,那樣會比較慢(還要程序初始化、解壓),遊戲啟動的時候很多人沒耐心等他載入,這個時候先顯示一張圖片給人看著先!
CN_Uninst下面是卸載的程序。Support下面是用戶許可協議、技術支持的聯繫方式等等,最常見的是readme.txt,裡面會告訴你如何解決諸如黑屏、死機、不兼容之類的問題。當然這些文件都可以刪,遊戲照樣能玩。

相比來說Braid就簡單多了,他是一個2D的小型遊戲,如下:

該遊戲支持多國語言,要玩哪個語言就從哪個語言的bat開始執行,所以有CHINESE, ENGLISH等等這麼多文件。
除了根目錄以外,上面只有兩個文件夾(Braid guides這個文件夾是我自己另外建的)。licenses裡面只是文本格式的許可協議而已。真正有內容的就只有data這一個文件夾。

fonts裡面有三個字體文件,分別是日文、韓文、繁體中文(別的語言怎麼辦?在下面的zip文件裡面,因為拉丁語系的字體文件小,不單獨放在外面了)。strings裡面是要顯示的文字,每種語言一個文件(所以如果劇情、對白之類的有修改,發補丁就只發strings裡面的文件即可)。

package.zip和package0.zip兩個文件是普通的zip壓縮格式,打開可以看到分別存了什麼,有運行所需的數據、著色器、聲音、圖像等等。 為什麼分兩個zip呢? 這是程序員自己覺得方便,自己定義的,如果你開發的遊戲你也可以只用一個zip或者用3個zip都可以。

打開其中一個zip,很多jpg和bmp格式的圖片。再打開一個叫做animation的文件夾,裡面定義了遊戲中的人物動作:
jumping
0.000000
3 0.000000
277 583 58 67 29 2 0 0
414 586 60 67 30 2 0 0
339 514 59 67 30 2 0 0

bounce
0.500000
4 0.000000
63 774 59 56 28 1 -20 22
246 965 57 57 27 2 -20 21
64 835 57 59 27 4 -20 22
308 846 56 56 27 3 -22 22

這便是兩個不同人物做「跳躍」動作的代碼,這些數字可以推測指的是圖片中的像素, 後面有正負數的是位移的像素值。


Windows下的,DLL和EXE就不說了。
其他還有

  1. 配置文件,比如*.XML、*.INI,特別是XML,拓展性強,用來寫皮膚、儲存數據、儲存配置等等都行;
  2. 圖片,不多說,常見的*.ICO、*.PNG等等;
  3. 提示音文件,例如*.Wav;
  4. 資料庫文件,比如*.DB;
  5. 超文本標記語言文件,例如Web Browser控制項展示*.HTML作為幫助文檔,為什麼用HTML呢?因為布局起來還是挺方便的,當然,這也包括了*.CSS、*.JS等等;
  6. *.CHM、*.PDF等等,作用同上;
  7. *.RTF、*.TXT,主要是展示License、ReadMe等等;

基本上一個典型應用程序,除開各種EXE和DLL,最多的第一就是媒體文件、其次就是配置文件、數據文件、然後就是幫助、介紹文件等等。


以前的一些遊戲不加密,大多數東西所見即所得,比如遊戲里的視頻、音樂全都是可見的
但是後來基本做成加密的了,反正有些格式是自定義的,比如一大坨bin文件,或者一大堆根本認不到的東西
這時候,你點擊主程序進去了,主程序根據自己內部的解碼方案去訪問這些東西。而你直接從外部訪問的話是無法訪問的,因為你不知道數據是怎麼構成的
至於都包含什麼,其實大家談論最多的也就是dll了吧,dll就是動態鏈接庫

舉個不恰當的例子的話

以前的一些exe就是那種地下室,一個exe就搞定整個屋子裡的配置
而對於那種組成很多的,exe則只是別墅的玄關,dll以及各種數據則是別墅里的其他內容
沒有這個exe你進不了屋子,但是沒有那些dll,你幹不了其他事
而賣房子的交房之前會檢查每個屋子的功能,如果哪個屋子有問題他是不會交房的,也即exe會執行自檢,如果發現那些東西缺失了,程序是不會執行的


所有的文件都是數據,作者決定它有什麼用,包括exe文件在內,所有文件的用途都沒有硬性規定。

以遊戲為例,
通常情況,玩家執行那個作為入口的exe,然後由exe來引導玩家進行整個遊戲,途中訪問其它的遊戲文件。那些文件可以是多媒體內容,可以是遊戲配置、存檔,可以是遊戲邏輯,也可以是另外一個入口。

因為這樣做比較合理,所以大家都這麼做。

前人之述備矣,


然……
那些都是不必要的

包括exe文件在內,所有文件的用途都沒有硬性規定。

我見過一個惡意程序,惡意代碼本體存放在ico(圖標)文件裡面(然後有些腦殘殺毒軟體就不查了)……

遊戲「入口」可以不是exe(上面有人舉例bat),如果遊戲作者足夠神經病,它可以讓你雙擊doc文件來進入遊戲。

音樂/視頻文件可以不是wav/avi(或者其它媒體格式),有時候,你把遊戲目錄中某些莫名其妙的文件硬拽進媒體播放器,會放出音樂/視頻來。但大多數情況下,遊戲公司還會進一步加密、打包。很多galgame也會這麼做,防止遊戲素材泄露。

可以只有一個exe文件,其它內容全部包進這個exe文件里,這個文件運行時可能會創建一些臨時文件,退出後自動刪除。因為這樣做會使程序變慢,大型遊戲通常不會這麼做,但是一些綠色軟體愛好者會喜歡這個。


舉一些實際例子。

《冰風谷2》,運行那個看上去像是「主程序」的exe文件,會進入反盜版系統,真正進入遊戲的「入口」是旁邊那個同名的dat文件。

《英雄無敵3》完全版,heroes3data裡面的Heroes3.vid文件,主要內容是遊戲動畫,不過,它同時兼任著「驗證遊戲光碟是否插入」的功能。

上例中,遊戲目錄里還有一些pdf文件,那是幫助文檔,介紹遊戲的基礎操作,應該在遊戲開始之前觀看。

《三國群英傳1》,除了主程序之外還有一個巨大的pak文件,估計這個文件里打包了幾乎所有的遊戲資料,圖片、聲音、動畫、文本……

《馬基埃亞爾的傳說》,有一些.teaa的文件,實際上是文件打包,解壓后里面是遊戲腳本。據說,將這些文件解壓入同名文件夾里並刪除原文件,可以增加遊戲速度。

某軟體,某dll文件會不斷變大,後來明白它是資料庫偽裝的。


  1. 庫文件。包括動態庫、靜態庫。
  2. 資源文件。音頻、圖片等。
  3. 配置文件。
  4. 數據文件。
  5. 日誌文件。
  6. 其他文件。中間文件、垃圾文件等。

補充下阿怪的答案中關於dll和exe分離的原因:
(轉自太平洋電腦網 地址為:Windows的活動大陸:細看DLL文件)

3.為什麼要用DLL

  剛才在談到這個問題的時候,只解釋了DLL將程序代碼封裝成函數的原理。為什麼封裝成函數,就能成為系統中大量使用DLL的理由呢?

  ①擴展應用程序

  由於DLL能被應用程序動態載入內存。所以,應用程序可以在需要時才將DLL載入到內存中,這讓程序的可維護性變得很高。比如QQ的視頻功能需要升級,那麼負責編寫QQ的程序員不必將QQ所有代碼都重寫,只需將視頻功能相關的DLL文件重寫即可。

  ②便於程序員合作

  這個和最終用戶關係不大,僅供了解。大家都知道編程工具有很多,比如VB、VC、Delphi等,如果好幾個人合作來編寫一個大的程序,那麼可能有的人用VB,有的人用VC,每人負責的部分所使用的編程語言都不同,究竟放在哪個編譯器中進行編譯呢?這就好比一群來自各個國家的人在共同編寫一篇文章,如果他們所使用的語言都不同,寫出來的文章怎麼可能湊到一起呢?而有了DLL後,可以讓VC程序員寫一個DLL,然後VB程序員在程序中調用,無需為怎麼將它們都編譯為一個單獨的EXE而發愁了。

  ③節省內存

  如果多個應用程序調用的是同一個動態鏈接庫,那麼這個DLL文件不會被重複多次裝入內存中,而是由這些應用程序共享同一個已載入內存的DLL。就好比一個辦公室中,很少會為每一個員工配置一台飲水機的,而是在一個公共位置放上一個飲水機,所有需要喝水的職員都可以共用這台飲水機,降低了成本又節約了空間。

  ④共享程序資源

  包括剛才提到過的通用文件對話框在內,DLL文件提供了應用程序間共享資源的可能。資源可以是程序對話框、字元串、圖標,或者聲音文件等。

  ⑤解決應用程序本地化問題

  在下載了某個程序的漢化包後,打開漢化說明,經常可以看到用下載包中的DLL文件覆蓋掉程序原來的DLL,漢化就完成了。這些程序都是將執行代碼和應用程序界面分開編寫了,所以漢化者只需簡單地將其中和程序界面相關的DLL漢化並發布即可。


圖片啊,音樂啊,GUI啊,劇情啊,存檔啊……


如果這個應用程序是一個裝滿各種亂起八糟東西的房間,那麼exe基本上就是一個導遊,跟著他才能進入這個房間里並找到你要的東西。
所有很多遊戲的破解補丁需要替換這個exe文件。房子還是一樣的房子,不過原來的導遊看你是一盜版用戶,根本就不搭理你,所以乾脆就換個導遊。


贊成@一隻阿怪 所舉的演唱會例子。我也舉個類似的例子吧。

我買了一隻手錶。手錶能走,能顯示時間,能轉旋鈕調節時間。
我不會去操心手錶「為什麼會走」,不會去管裡面有怎樣複雜的精密結構,有多少齒輪嚙合,有發條還是有電池什麼的。我只知道這是塊「手錶」,能看時間。
exe之外的東西就如同這些零件一樣,沒有他們,手錶就不能如預期那樣工作了。

只是,win的安裝方式讓這些文件和exe混合在一起,一眼望去,好像手錶的錶盤變透明了,你能一眼看到下面所有的機械傳動結構一樣。

如果不確定那些文件是做什麼的,就不要隨便亂動,放那裡就好了。就好像你不是修表師傅,隨便碰了哪個零件都會讓手錶不再工作。


私貨時間:
所以我更喜歡mac下處理app的方式:每個app其實是個文件夾,但卻彷彿是可執行文件一樣雙擊就能用,不用操心類似本問題的事情。對高級用戶而言,右鍵查看又可以看到內部結構。
還是手錶做比喻,mac下的app是平常看到的有錶盤和刻度的手錶,win下的exe是錶盤透明,能看到所有零件的手錶。

對電腦普通用戶而言,哪個簡單?


推薦閱讀:

阿里內推面試,應該注意什麼?
為什麼instagram被牆以後還能收到推送的通知?
怎麼用C語言繪製3D圖形,實現類似於UE4這樣的效果?
蘋果5s為什麼照片刪了之後還佔內存?
計算機程序如何識別音色?

TAG:遊戲 | 軟體 | 程序 |