Тема: JS: Проверка отсутствия в txt-файле информации
Есть ли возможность на JS как-то проверить содержит ли текстовый файл какую-либо информацию, либо он пустой?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Серый форум → Общение → Windows Script Host, HTA (VBScript, JScript) → JS: Проверка отсутствия в txt-файле информации
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Есть ли возможность на JS как-то проверить содержит ли текстовый файл какую-либо информацию, либо он пустой?
Да, есть.
дайте ссылку где пример можно глянуть
Капитан Очевидность мне подсказывает, что если файл непустой, то его размер не равен нулю. Делайте выводы сами.
JSman, а если в нём один только BOM?
alexii, ну как с Вами не согласиться? Абсолютно верно. Я просто человеку подсказку дал, а он может подумать над подводными камнями.
Вот код, чтобы не мучать.
function isEmptyTextFile(path)
{
try {
if (FSO.GetFile(path).Size==0) return true;
} catch(e) {}
return false;
}
WScript.Echo(isEmptyTextFile("123.txt").toString());
А так, немного усложним задачу, учитывая, что может каким-то образом попасться файл с BOM.
function isEmptyTextFile(path)
{
try {
var FSO = new ActiveXObject("Scripting.FileSystemObject");
if (FSO.GetFile(path).Size==0) return true;
if (FSO.GetFile(path).Size==3)
{
var f1 = FSO.OpenTextFile(path, 1, 0, 0);
var text = f1.Read(3);
f1.Close();
return text==decodeURI("%D0%BF%C2%BB%D1%97");
}
} catch(e) {}
return false;
}
WScript.Echo(isEmptyTextFile("123.txt").toString());
Ну, если уж совсем извратиться по определению маркеров кодировки файлов, то получим такое. :-)
var GlobalObject = this;
var FSO = fso = new ActiveXObject("Scripting.FileSystemObject");
var WshShell = new ActiveXObject("WScript.Shell");
Function.prototype.GetResource = function(ResourceName) {
if (!this.Resources) {
var UnNamedResourceIndex = 0,
_this = this;
this.Resources = {};
function f(match, resType, Content) {
_this.Resources[(resType == "[[") ? UnNamedResourceIndex++:resType.slice(1, -1)] = Content;
}
this.toString().replace(/\/\*(\[(?:[^\[]+)?\[)((?:[\r\n]|.)*?)\]\]\*\//gi, f);
}
return this.Resources[ResourceName];
}
function Resourses() {
/*[vbs[
Function [_MidB](v, s, l):[_MidB]=MidB(v, s+1, l):End Function
Function [_Asc](v):[_Asc]=Asc(v):End Function
Function [_Chr](v):[_Chr]=Chr(v):End Function
Function [_VarType](v):[_VarType]=VarType(v):End Function
Function [_TypeName](v):[_TypeName]=TypeName(v):End Function
Function [_ChrB](v):[_ChrB]=ChrB(v):End Function
Function [_AscB](v):[_AscB]=AscB(v):End Function
Function [_LeftB](v, l):[_LeftB]=LeftB(v, l):End Function
Function [_RightB](v, l):[_RightB]=RightB(v, l):End Function
Function [_InstrB](start, stringtosearch, stringtofind, comparemode):[_InstrB]=InstrB(start, stringtosearch, stringtofind, comparemode):End Function
Sub ConvertBinaryToJSArray(arrByteArray, js_arr)
Dim i
For i = 1 To LenB(arrByteArray)
js_arr.push(AscB(MidB(arrByteArray, i, 1)))
Next
End Sub
]]*/
}
var VBSEngine = new ActiveXObject('ScriptControl');
VBSEngine.Language = 'VBScript';
VBSEngine.AddCode(Resourses.GetResource("vbs"));
WshShell.CurrentDirectory = GetScriptDir();
Array.prototype.map = function(mapper, that) {
var other = new Array(this.length);
for (var i = 0, n = this.length; i < n; i++)
other[i] = mapper.call(that, this[i], i, this);
return other;
}
function BinaryToArray(binary) {
var ar = [];
VBSEngine.CodeObject.ConvertBinaryToJSArray(binary, ar);
return ar;
}
function TypeOf(o) {
var type = typeof o;
if (type != "object" && type != "unknown") return type;
if (o === null || o === undefined) return "empty";
if (Object.prototype.toString.call(o) === '[object Array]') return "array";
if (Object.prototype.toString.call(o) === '[object Number]') return "number";
if (Object.prototype.toString.call(o) === '[object String]') return "string";
if (VBSEngine.CodeObject._VarType(o) == (8192 + 17)) return "bytearray";
return type;
}
function Exit() {
if (this.WScript) WScript.Quit();
if (this.window) window.close();
}
function MsgBox(strText, strTitle, nType) {
return WshShell.Popup(strText, 0, strTitle, nType);
}
function GetScriptDir() {
return GetScriptFullPath().replace(/\\+[^\\]+$/g, "");
}
function GetScriptFullPath() {
if (this.location && this.location.href) return location.href.replace(/^.+\/\/\//, "").replace(/\//g, "\\");
if (this.WScript) return WScript.ScriptFullName;
return "";
}
function StringToASCIIArray(string, start, end) {
start = start || 0;
end = end || string.length;
string = string.slice(start, end);
return string.split("").map(function a(s) {
return Asc(s);
})
}
function Asc(str) {
return VBSEngine.CodeObject._Asc(str);
}
function Hex(expression, length) {
var res = expression.toString(16);
length = Math.max(length || 0, res.length);
return new Array(length + 1).join("0").replace(new RegExp(".{" + res.length + "}$"), res).toUpperCase();
}
function Bin(expression) {
var res = expression.toString(2);
var length = Math.floor(res.length / 8) + ((res.length % 8 > 0) ? 1 : 0);
length *= 8;
return new Array(length + 1).join("0").replace(new RegExp(".{" + res.length + "}$"), res).toUpperCase();
}
function FileGetSize(path) {
try {
return FSO.GetFile(path).Size;
} catch(e) {
return 0;
}
}
function FileGetEncoding(path) {
var f = FSO.OpenTextFile(WshShell.ExpandEnvironmentStrings(path), 1, 0, 0);
var n = FSO.GetFile(path).Size;
n = n <= 256 ? n : 256;
var val = StringToASCIIArray(f.Read(n));
f.Close();
return EncodingDetect(val);
}
function EncodingDetect(str) {
var ar, type = TypeOf(str);
if (type == "string") ar = StringToASCIIArray(str);
if (type == "bytearray") ar = BinaryToArray(str);
if (type == "array") ar = (str);
if (!ar) return 0;
var head = ar.slice(0, 4).map(function(x) {
return Hex(x, 2)
}).join("");
if (/^EFBBBF/.test(head)) return "UTF-8";
if (/^0000FEFF/.test(head)) return "UTF-32BE";
if (/^FFFE0000/.test(head)) return "UTF-32LE";
if (/^2B2F76(38|39|2B|2F)/.test(head)) return "UTF-7";
if (/^F7644C/.test(head)) return "ISO-10646-UTF-1";
if (/^DD736673/.test(head)) return "UTF-EBCDIC";
if (/^0EFEFF/.test(head)) return "SCSU";
if (/^FBEE28/.test(head)) return "BOCU-1";
if (/^84319533/.test(head)) return "GB-18030";
if (/^FEFF0000/.test(head)) return "ISO-10646-UCS-4";
if (/^0000FFFE/.test(head)) return "ISO-10646-UCS-4";
if (/^FEFF/.test(head)) return "UTF-16BE";
if (/^FFFE/.test(head)) return "UTF-16LE";
var head2 = ar.slice(0, 60).map(function(x) {
return Bin(x)
}).join("");
if (/^(0.{7}|110.{5}10.{6}|1110.{4}10.{6}10.{6}|11110.{3}10.{6}10.{6}10.{6}|111110.{2}10.{6}10.{6}10.{6}10.{6}|1111110.110.10.{6}10.{6}10.{6}10.{6}10.{6}){10,}/.test(head2)) return "UTF-8 without BOM";
return "ASCII";
}
function isEmptyTextFile(path) {
var enc = FileGetEncoding(path);
var size = FileGetSize(path);
if (/UTF-16/.test(enc) && size == 2) return true;
if (/ASCII/.test(enc) && size == 0) return true;
if (/UTF-32|UTF-7|UTF-EBCDIC|GB-18030|ISO-10646-UCS-4/.test(enc) && size == 4) return true;
if (/ISO-10646-UTF-1|SCSU|BOCU|UTF-8/.test(enc) && size == 3) return true;
return size == 0;
}
MsgBox(isEmptyTextFile("123.txt"));
Exit();
alexii, ну как с Вами не согласиться? Абсолютно верно. Я просто человеку подсказку дал, а он может подумать над подводными камнями.
Да нет, я просто рассуждаю. Нам ведь неведомо, что скрывается под авторским определением «пустой текстовый файл». Я потому и тему открыл, дабы он мог уточнить, как сие понимать.
Консольное приложение делает вывод в текстовый файл (когда есть что выводить), я конечно использовал св-во size объекта file на сравнение со значением "0", но как-то всё очень просто показалось... подумал, что может какие "подводные камни" могут быть?! Вот и открыл тему... сожалею, что в первом посте не привел код на сравнение размера файла со значением "0" и это вызвало такие эмоциональные ответы у первого отвечающего, что он даже спешно закрыл тему, наверное, боялся ответов с моей стороны... ну да бог с ним... по обсуждению понял, что это вообщем единственный метод, поэтому, всем спасибо, тема закрыта.
im2002, тему я закрыл по причине её "спамо-трольного" развития и нарушения пункта правил 4.3, 4.5, 4.10, 4.11 и многих других.
Ссылка на перечисленные правила. Рекомендую почитать.
Вы задали вопрос: "Есть ли возможность на JS как-то проверить содержит ли текстовый файл какую-либо информацию, либо он пустой?". Вопрос подразумевает ответ "да" или "нет". Я ответил на Ваш вопрос утвердительно. Вопрос задан, ответ получен. Засорение форума однотипными вопросами, которые многократно обсуждались здесь и на просторах интернета, да и ответы на которые находятся за 5 секунд в поисковике, считаю проявлением неуважения к его участникам и моя прямая обязанность, как модератора - не позволять этого делать пользователям. Заметьте - тему удалять не стал, так как предположил, что она может получить развитие, если другие модераторы и руководство пожелает.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться