寫入使用者端資料夾並建立文件作法
由於需配合當前系統的架構,因此在寫入資料夾建立文字檔案部分主要透過以下方法實作:
ActiveXObject("Scripting.FileSystemObject")
// 創建 FileSystemObject
var fso = new ActiveXObject("Scripting.FileSystemObject");
2.定義檔案路徑
// 定義檔案路徑、文字檔案名稱(如寫入 C:\temp\123.txt)
var folderPath = "C:\\temp";
var filePath = folderPath + "\\123.txt";
3.判斷當前有無此資料夾
// 如果資料夾不存在,創建資料夾
if (!fso.FolderExists(folderPath)) {
fso.CreateFolder(folderPath);
}
4.寫入資料夾底下並建立文字檔案
設定 true 為覆蓋前一個檔案內容,如果設定 false 則會產生一個新的文字檔案
不過這部分我就沒有嘗試過,不過因為程式裡都是寫 123.txt
所以程式是否會因為該資料夾底下已有相同檔名報錯這我就不清楚了,大家可以修改玩玩看
var content = "123" // content的部分可依實際情況調整,如變數串成的內容或固定內容
var file = fso.CreateTextFile(filePath , true); // 覆蓋模式
file.WriteLine(content);
file.Close();
5.例外處理、LOG文字檔案設計
因應不可知的例外,透過 try catch 來包覆,並產生 errorLog檔案
此部分還沒有精進的很完整,僅先提供一個初步的範例
try {
}catch (e) {
// 錯誤處理:記錄錯誤訊息
var errorLogPath = "C:\\temp\\error_log.txt";
var logFile = fso.CreateTextFile(errorLogPath, true); // 覆蓋模式
logFile.WriteLine("錯誤時間:" + new Date().toLocaleString());
logFile.WriteLine("錯誤訊息:" + e.message);
logFile.Close();
alert("檔案寫入失敗!\n錯誤訊息已記錄至:" + errorLogPath);
}
接下來就將前面的程式碼統整後如下:
try {
// 創建 FileSystemObject
var fso = new ActiveXObject("Scripting.FileSystemObject");
// 定義檔案路徑、文字檔案名稱(如寫入 C:\temp\123.txt)
var folderPath = "C:\\temp";
var filePath = folderPath + "\\123.txt";
// 如果資料夾不存在,創建資料夾
if (!fso.FolderExists(folderPath)) {
fso.CreateFolder(folderPath);
}
var content = "123" // content的部分可依實際情況調整,如變數串成的內容或固定內容
var file = fso.CreateTextFile(filePath , true); // 覆蓋模式
file.WriteLine(content);
file.Close();
}catch (e) {
// 錯誤處理:記錄錯誤訊息
var errorLogPath = "C:\\temp\\error_log.txt";
var logFile = fso.CreateTextFile(errorLogPath, true); // 覆蓋模式
logFile.WriteLine("錯誤時間:" + new Date().toLocaleString());
logFile.WriteLine("錯誤訊息:" + e.message);
logFile.Close();
alert("檔案寫入失敗!\n錯誤訊息已記錄至:" + errorLogPath);
}
大致上就是這樣,因為條碼列印牽涉到自動以及手動補印
因此後續我還有改成自動列印.txt、自動列印的 Log.txt、手動補印.txt、手動補印的 Log.txt自動列印的 Log.txt 和 手動補印的 Log.txt 分別放在個別的資料夾底下以做區分並做成不覆蓋的模式
也就是 自動列印.txt、手動補印.txt 的內容是可以覆蓋,用來讓之後透過 WinForms 執行的程式監聽
而 Log 的部分則產生後留在使用者端的資料夾裡,這部分 WinForms 也會根據時間日期來定期自動清理~
因此後來我有寫成 function 程式碼如下:
// path 為 filePath content 則一樣
//allowOverwrite 則是看是否要覆蓋原檔或不覆蓋
//以此決定是否是 Log 檔還是列印內容的檔案,如果要覆蓋怎必須是 true
function writeFile(path, content, allowOverwrite) {
if (allowOverwrite) {
var file = fso.CreateTextFile(path, true); // 覆蓋模式
file.WriteLine(content);
file.Close();
} else {
// 自動產生不重複的檔案名稱
var baseName = path.substring(path.lastIndexOf("\\") + 1, path.lastIndexOf("."));
var extension = path.substring(path.lastIndexOf("."));
var folderPath = path.substring(0, path.lastIndexOf("\\"));
var uniquePath = getUniqueFileName(folderPath, baseName, extension);
var file = fso.CreateTextFile(uniquePath, false); // 不覆蓋模式
file.WriteLine(content);
file.Close();
}
}
以上就是在 JS 寫入 使用者端的程式碼,目前僅知道能在 IE 瀏覽器上運作,且必須設定信任網站和相容性
相關 ActiveX 控制項也必須允許才能使用
過程中我也有瀏覽過其他有關這部分的討論及文章,發現有本機安全問題的考量
因此此做法推測應該沒有那麼適合現代?不過希望能夠幫助到也要維護較舊系統的你或是要開發的你