1

Тема: JS, VBS: Как назначить дату создания и последнего доступа к файлу?

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


    var filepath = "C:\\123\\test.txt";
    var time = "20121105112011";

    var m = time.replace(/(.{4})(.{2})(.{2})(.{2})(.{2})(.{2})/, "$1/$2/$3 $4:$5:$6 PM");

    var objShell = new ActiveXObject("Shell.Application");
    var dir_path = filepath.replace(/\\[^\\]+$/g, "");
    var file_name = filepath.split("\\").pop();
            
    var objFolder = objShell.NameSpace(dir_path)
    var objFolderItem = objFolder.ParseName(file_name);

    objFolderItem.ModifyDate = m;

2

Re: JS, VBS: Как назначить дату создания и последнего доступа к файлу?

Привет !
Вот рабочий пример на VBS

Sub Touch(FolderPath, FileName, NewDate)
  Set app = CreateObject("Shell.Application")
  Set folder = app.NameSpace(FolderPath)
  Set file = folder.ParseName(FileName)
  file.ModifyDate = NewDate
End Sub
Touch("C:\", "somefile.txt", "2012-01-01")

Разница только в формате я думаю, так что в региональных настройках посмотреть что указано в качестве разделителя и должно работать...ИМХО

Времени не хватает... :-(

3

Re: JS, VBS: Как назначить дату создания и последнего доступа к файлу?

Евген, спасибо, конечно. Но Ваш пример только меняет дату последнего изменения, а дату создания или доступа - нет.

4 (изменено: Евген, 2013-12-15 20:31:27)

Re: JS, VBS: Как назначить дату создания и последнего доступа к файлу?

Во я тупанул...
Читаю про одно, думаю про другое...)))

По моему как то встречал подобное через чтение и изменение аттрибутов файла...

Времени не хватает... :-(

5 (изменено: badik, 2013-12-16 11:36:17)

Re: JS, VBS: Как назначить дату создания и последнего доступа к файлу?

свойство FSO.File.DateCreated - readonly

1.Можно временно менять системную дату:

@echo off
setlocal
 
set file=C:\SOMEFILE.EXE
set filedate=10/1/2001
 
set currdate=%date:~4,11%
date %filedate%
echo F | xcopy "%file%" "%file%.tempname" > NUL
move "%file%.tempname" "%file%" > NUL
date %currdate%

2. сторонней утилитой  FileTouch.exe

6

Re: JS, VBS: Как назначить дату создания и последнего доступа к файлу?

badik, именно 2й вариант я пытался избежать, но судя по всему он наиболее эффективный. Большое спасибо Вам.
Я все думал поиграть с Rundll32 kernel32.dll SetFileTime. Но даже если бы нашелся способ, он выполнялся бы очень медленно.

7

Re: JS, VBS: Как назначить дату создания и последнего доступа к файлу?

JSman
А утилиты не годятся? nircmd, FileTouch, GNU-Touch, touchdot (+ Юникод).

8

Re: JS, VBS: Как назначить дату создания и последнего доступа к файлу?

Flasher, годятся   Потому что  иного решения нет. Еще бы оформить все это дело надлежащим образом. Например, неудобно со скриптом таскать бинарник, скорее всего его надо вставить в тело функции и по умному распаковывать.

9

Re: JS, VBS: Как назначить дату создания и последнего доступа к файлу?

JSman пишет:

Еще бы оформить все это дело надлежащим образом.

А с утилитами что там оформять? WSH.Run "бла бла", 0

10

Re: JS, VBS: Как назначить дату создания и последнего доступа к файлу?

JSman пишет:

Годятся   Потому что  иного решения нет. Еще бы оформить все это дело надлежащим образом. Например, неудобно со скриптом таскать бинарник, скорее всего его надо вставить в тело функции и по умному распаковывать.

Вуаля. Пример на VBS. Использует системный cmd.exe для смены.
http://computer-programming-forum.com/5 … ca7362.htm

Хотя такой вариант мне кажется более предпочтительным:

http://blogs.technet.com/b/heyscripting … puter.aspx

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

11

Re: JS, VBS: Как назначить дату создания и последнего доступа к файлу?

Xameleon, то есть для изменения даты последнего доступа к файлу мне надо каждый раз менять системную дату? Как-то выглядит накладным решение.

12

Re: JS, VBS: Как назначить дату создания и последнего доступа к файлу?

JSman пишет:

Например, неудобно со скриптом таскать бинарник, скорее всего его надо вставить в тело функции и по умному распаковывать.

Только заметил, что не так прочёл (батник вместо бинарник). Бинарник паковать можно в b64. Как распаковывать, примеры приводились, У Serge Yolkin есть тут несколько hta с подобной формой запуска.

13

Re: JS, VBS: Как назначить дату создания и последнего доступа к файлу?

В общем придумал способ покрасивее, чем хранить бинарник в коде. Только не плюйтесь Используем компилятор jscript на .NET под названием jsc.exe. Вот как раз через него все проблемы и можно решить. Он пратически на каждой машине. Какие плюсы? Открытость исходного кода, а также скорость выполнения задачи. Таким образом я как бы "распаковываю" содержание строки в файл и создаю бинарник.

14

Re: JS, VBS: Как назначить дату создания и последнего доступа к файлу?

JSman
1) Можно взглянуть на пример ? Уж очень интересная и вкусная тема.

2) В аттаче приложил свой вариант решения. К сожалению через ActiveX, но
а) с автоматической регистрацией
б) кода для регистрации не требуется
в) Регистрация и запуск происходит без запросов.

Там же в аттаче полный исходник и апдейтор CAB-а.

Для теста запустить sample.hta

У объекта есть 2 метода:

OpenFile() и UpdateDates()

и 3 свойства:

DateCreated, DateLastAccessed, DateLastModified

После вызова OpenFile() свойства заполняются соответствующими датами файла.

Свойства работают на чтение и запись.

UpdateDates() используется для сохранения изменений.

Post's attachments

FileTimesEditor.zip 109.9 kb, 14 downloads since 2013-12-31 

You don't have the permssions to download the attachments of this post.
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

15

Re: JS, VBS: Как назначить дату создания и последнего доступа к файлу?

1. Менять системную дату категорически не рекомендуется. Совсем.
2. Упаковать в base64 можно. Но надо быть готовым к тому, что скрипт будет намертво блокироваться особо продвинутыми антивирусами.

JSman, а зачем распаковывать строку в бинарник? Почему не сразу System.IO.File и методы «.SetCreationTime()», «.SetLastAccessTime()», «.SetLastWriteTime()»?

16 (изменено: Flasher, 2013-12-31 12:23:47)

Re: JS, VBS: Как назначить дату создания и последнего доступа к файлу?

JSman пишет:

Он пратически на каждой машине.

Я бы не был столь категоричен, если, конечно, речь не про свои корпоративные. Много где на XP обходятся без Framework'а.

Xameleon
Что компонент, что утилита - велика ли разница, если таскать что-то дополнительное  с собой не возымело нужды?
Если лишние файлы не страшны, то проще и без регистрации обойтись, написав манифест.

17

Re: JS, VBS: Как назначить дату создания и последнего доступа к файлу?

Flasher

Flasher пишет:

Что компонент, что утилита - велика ли разница, если таскать что-то дополнительное  с собой не возымело нужды?
Если лишние файлы не страшны, то проще и без регистрации обойтись, написав манифест.

Полностью согласен. Действительно хотелось бы реализовать это без доп. файлов, но пока не нашёл способа. С манифестами там гемор, что запускающий интерпретатор (WScript/CScript/и т.п) должен быть в том же каталоге, что и скрипт и ActiveX и манифест. Иначе он не видит манифеста (на сколько я помню). Возможно ошибаюсь.

А отдельные утилиты не люблю чисто из эстетических соображений, т.к при этом стартуется отдельный EXE модуль и висит процессом в памяти. Ну фиг знает... Не аккуратненько как-то, IMHO. И канал связи с ними ограниченный, обмен объектами делать неудобно.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

18

Re: JS, VBS: Как назначить дату создания и последнего доступа к файлу?

Xameleon пишет:

С манифестами там гемор, что запускающий интерпретатор (WScript/CScript/и т.п) должен быть в том же каталоге, что и скрипт и ActiveX и манифест.

Интерпретатор + компонент + манифест, а скрипт может лежать где угодно.
Но по мне лучше такой гемор, чем ерзания в реестре на разных машинах.

А отдельные утилиты хороши готовыми опциями (рекурсия, файл-источник).

Xameleon пишет:

И канал связи с ними ограниченный, обмен объектами делать неудобно.

Это да, хотя логи можно писать в файл через .Run cmd ..., 0, чтобы консоль при их чтении глаз не мозолила. Там по сути кроме проверки статуса выполнения ничего и не требуется.

19

Re: JS, VBS: Как назначить дату создания и последнего доступа к файлу?

Xameleon пишет:

2) В аттаче приложил свой вариант решения. К сожалению через ActiveX, но

Большое спасибо! Попробую использовать в решении с манифестом.

alexii пишет:

JSman, а зачем распаковывать строку в бинарник? Почему не сразу System.IO.File и методы «.SetCreationTime()», «.SetLastAccessTime()», «.SetLastWriteTime()»?

alexii, не хочетсядополнительной регистрации сборок в реестре, в том числе System. Решение с компиляцией меня больше устраивает, хотя бы по той причине, что скорость выполнения кода JScript.NET быстрее в WSH, да и никакой регистрации не надо.

Xameleon пишет:

JSman
1) Можно взглянуть на пример ? Уж очень интересная и вкусная тема.

Xameleon, привожу черновой вариант решения. Хочу отметить, что данное решение пашет из-под учетной записи Гость.

Параметры функции FileSetTime
1. root - каталог, в котором будет осуществляться поиск файлов.
2. mask - маска поиска файла. может быть строкой, в которой используются классические * и ?. А также mask может быть регулярным выражением.
3. date - строковое представление даты и времени. YYYYMMDDHHMMSS.
4. deep - флаг рекурсии.


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 GetResource(ResourceName)
{
    return arguments.callee.caller.GetResource(ResourceName);
}

    var FSO = fso = new ActiveXObject("Scripting.FileSystemObject");
    var WshShell= new ActiveXObject("WScript.Shell");

function FileSetTime(root, mask, datestring, typeOfFunction, deep)
{
/*[FileSetTime[
import System.Environment;
import System.IO;

// searches files by a string type classic mask or regexp type mask. if in-param "callback" is undefined function returns an array of found pathes. 
function Search(root, re, callback, deep)
{
    var e, files=[], dirs=[], result=[];
    
    if (!root) root = Directory.GetCurrentDirectory();
    
    if (!re) re = /./;
    
    if (typeof re == "string" && /^\/.*\/[gmi ]*$/.test(re)) 
    {
        var m = re.match(/(^\/.*\/)([gmi ]*)$/i);
        re = new RegExp(m[1].replace(/^\/|\/$/g,""), m[2]);
    }
    
    if (typeof re == "string") re = new RegExp("("+re.replace(/[\^\\\*\[\]\{\}\(\)\$]/g, "\\$&").replace(/\|/g,")|(").replace(/\?/g, ".").replace(/(\*)/g, ".*")+"$)", "gi");
    
    if (!callback) callback = function (a){result.push(a)};
    
    if (typeof deep=="undefined") deep = true;
    deep = !!deep;
      
    try
    {
        files = Directory.GetFiles(root);
        
        for (var i=0, l=files.length; i<l; i++)
        {
            if (re.test(files[i])) callback(files[i]);
            
        }
        
        if (!deep) return result;
        
        dirs = Directory.GetDirectories(root);
        for (var i=0, l=dirs.length; i<l; i++)
        {
            try {
            Search(dirs[i], re, callback);
            } catch (e){ };
        }
    }
    catch (e) {}
    return result;
}

var root, mask, deep, datestring;

var params = System.Environment.GetCommandLineArgs();
// root, mask, dateString, typeOfFunction {0,1,2}, deep{true|false}

if (params.length!=6) System.Environment.Exit();

var dateMatch = (params[3]+"00000000000000").match(/^(....)(..)(..)(..)(..)(..)/);
var date = new Date(dateMatch[1], dateMatch[2]-1, dateMatch[3], dateMatch[4], dateMatch[5], dateMatch[6]);

function SetCreationTime(path)
{
    var e; try {File.SetCreationTime(path, date)} catch (e) {};
}

function SetLastAccessTime(path)
{
    var e; try {File.SetLastAccessTime(path, date)} catch (e) {};
}

function SetLastWriteTime(path)
{
    var e; try {File.SetLastWriteTime(path, date)} catch (e) {};
}

var funcs = [SetLastWriteTime, SetCreationTime, SetLastAccessTime];

Search(params[1], params[2], funcs[params[4] % 3], params[5]);
]]*/
    
    function CreateApp()
    {
        var path = WshShell.ExpandEnvironmentStrings("%TMP%\\test.txt");
        try {
        var f = fso.CreateTextFile(path,true);
        f.WriteLine(FileSetTime.GetResource("FileSetTime"));
        f.Close();
        var CurrentDirectory = WshShell.CurrentDirectory;
        WshShell.CurrentDirectory = WshShell.ExpandEnvironmentStrings("%TMP%");
        WshShell.Run("%WINDIR%\\Microsoft.NET\\Framework\\v2.0.50727\\jsc %TMP%\\test.txt", 0, 1);
        WshShell.CurrentDirectory = CurrentDirectory;
        
        }
        catch (e) {}
    }

    if (!root) root = WshShell.CurrentDirectory;
    if (!mask) mask = "";
    if (!datestring) datestring="1970010100000000"; 
    if (typeof typeOfFunction=="undefined") typeOfFunction = 0;
    if (typeof deep == "undefined") deep = 1;
    
    
    if (!FSO.FileExists(WshShell.ExpandEnvironmentStrings("%TMP%\\test.exe"))) {CreateApp();}
    if (FSO.FileExists(WshShell.ExpandEnvironmentStrings("%TMP%\\test.exe")))
    WshShell.Run("%TMP%\\test.exe "+'"'+[root, mask, datestring, typeOfFunction, deep].join('" "')+'"', 0, 1);
}

FileSetTime(WshShell.ExpandEnvironmentStrings("%TMP%"), "*.txt", "199212010000");

20

Re: JS, VBS: Как назначить дату создания и последнего доступа к файлу?

Решение с компиляцией меня больше устраивает, хотя бы по той причине, что скорость выполнения кода JScript.NET быстрее в WSH, да и никакой регистрации не надо.

Так и я про компиляцию. Только напрямую: исходный код, пакетный файл.

21

Re: JS, VBS: Как назначить дату создания и последнего доступа к файлу?

alexii, а можете чуть подробнее написать? Потому что я не до конца Вас понял. В коде как раз и используются System.IO.File и
методы «.SetCreationTime()»,
«.SetLastAccessTime()», «.SetLastWriteTime()».

22

Re: JS, VBS: Как назначить дату создания и последнего доступа к файлу?

В коде как раз и используются System.IO.File и  методы «.SetCreationTime()»,  «.SetLastAccessTime()», «.SetLastWriteTime()».

Значит, это я Вас поначалу неправильно понял. Вопросов нет.

23

Re: JS, VBS: Как назначить дату создания и последнего доступа к файлу?

Как на ваш взгляд, коллеги, считаете ли вы адекватеным использование .NET взамен ActiveX? Большой ли процент машин без .NET?

24 (изменено: Flasher, 2014-01-03 14:32:55)

Re: JS, VBS: Как назначить дату создания и последнего доступа к файлу?

Вот статейка. Но я думаю, цифры не в пользу .NET куда существеннее (25-30%).
Адекватным считать можно, но очевидно, что будет не айс.

25

Re: JS, VBS: Как назначить дату создания и последнего доступа к файлу?

На 2010 год

Well over 90% of the PCs in the world have some version of the .NET Framework installed.

26 (изменено: Flasher, 2014-01-03 14:53:26)

Re: JS, VBS: Как назначить дату создания и последнего доступа к файлу?

Дело в том, что эти данные приведены по результатам опросов, и скорее, системных админов компаний. Не факт, что там вообще фигурировала Росиия и многие другие страны.
О том как у нас, мы можем судить по результатам знакомств с другими машинами и пользователями сети.
К тому же не надо забывать, что на одной машине может быть установлена не одна версия ОС с разной начинкой, поэтому тут всё далеко не так прозрачно.