Автоматическое создание/загрузка структуры файлов и папок при запуске проекта

darkdiver

Administrator
Команда форума
Регистрация
13.01.2009
Сообщения
2 285
Благодарностей
2 730
Баллы
113
Кто-то уже продает проекты, кто-то только собирается, а кому-то надо сделать переносимые проекты между разными компьютерами.
Проекты обычно работают с каким-то набором данных и надо их распространять вместе с проектом.
Делается это примерно так. Создаем архив со структурой данных, заливаем на сервер, чтобы файл был доступен по http, потом ваш шаблон должен проверять, есть ли директория и если нет, то скачать и распаковать.
Вот 2 простых C# снипета, которые помогут вам это сделать.

Первый снипет поможет вам упаковать вашу директорию с файлами проекта
C#:
lock(SyncObject)
{
    // функция сжатия файлов
    Action<string, string, System.IO.Compression.GZipStream> compressFile = (sDir, sRelativePath, zipStream) =>
    {
        //запишем имя файла
        var chars = sRelativePath.ToCharArray();
        zipStream.Write(BitConverter.GetBytes(chars.Length), 0, sizeof(int));
        foreach (var c in chars)
            zipStream.Write(BitConverter.GetBytes(c), 0, sizeof(char));

        //Compress file content
        var bytes = System.IO.File.ReadAllBytes(System.IO.Path.Combine(sDir, sRelativePath));
        zipStream.Write(BitConverter.GetBytes(bytes.Length), 0, sizeof(int));
        zipStream.Write(bytes, 0, bytes.Length);
    };
        
    // в переменной dirToPack должны лежать ваши файлы проекта
    var sInDir = project.Variables["dirToPack"].Value;
    // в переменной packedFile должен лежать путь, в какой файл будем архивировать
    var sOutFile = project.Variables["packedFile"].Value;

    var sFiles = System.IO.Directory.GetFiles(sInDir, "*.*", System.IO.SearchOption.AllDirectories);
    var iDirLen = sInDir[sInDir.Length - 1] == System.IO.Path.DirectorySeparatorChar ? sInDir.Length : sInDir.Length + 1;
    // архивируем все файлы из директории в один файл
    using (var outFile = new System.IO.FileStream(sOutFile, System.IO.FileMode.Create, System.IO.FileAccess.Write, System.IO.FileShare.None))
    using (var str = new System.IO.Compression.GZipStream(outFile, System.IO.Compression.CompressionMode.Compress))
        foreach (var sFilePath in sFiles)
        {
            var sRelativePath = sFilePath.Substring(iDirLen);
            compressFile(sInDir, sRelativePath, str);
        }
}

Второй снипет поможет распаковать
C#:
lock(SyncObject)
{
    // в переменной dirToUnpack должен содержаться путь к папке проекта с данными
    var destDir = project.Variables["dirToUnpack"].Value;
   // url откуда будем качать файл с настройками
    var packedFile = project.Variables["packedFile"].Value;
    // если директория с данными уже создана
    if (System.IO.Directory.Exists(destDir)) return "ok";
    // if no then download file and create data structure
    var file = ZennoPoster.HttpGet(packedFile, respType: ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.File);
    // create a function to decompress
    Func<string, System.IO.Compression.GZipStream, bool> deCompressFile = (sDir, zipStream) =>
    {
        //Decompress file name
        var bytes = new byte[sizeof(int)];
        var readed = zipStream.Read(bytes, 0, sizeof(int));
        if (readed < sizeof(int))
            return false;

        var iNameLen = BitConverter.ToInt32(bytes, 0);
        bytes = new byte[sizeof(char)];
        var sb = new System.Text.StringBuilder();
        for (var i = 0; i < iNameLen; i++)
        {
            zipStream.Read(bytes, 0, sizeof(char));
            var c = BitConverter.ToChar(bytes, 0);
            sb.Append(c);
        }
        var sFileName = sb.ToString();


        //Decompress file content
        bytes = new byte[sizeof(int)];
        zipStream.Read(bytes, 0, sizeof(int));
        var iFileLen = BitConverter.ToInt32(bytes, 0);

        bytes = new byte[iFileLen];
        zipStream.Read(bytes, 0, bytes.Length);

        string sFilePath = System.IO.Path.Combine(sDir, sFileName);
        string sFinalDir = System.IO.Path.GetDirectoryName(sFilePath);
        if (!System.IO.Directory.Exists(sFinalDir))
            System.IO.Directory.CreateDirectory(sFinalDir);

        using (var outFile = new System.IO.FileStream(sFilePath, System.IO.FileMode.Create, System.IO.FileAccess.Write, System.IO.FileShare.None))
            outFile.Write(bytes, 0, iFileLen);

        return true;
    };
    // разжимаем файл, который скачали
    using (var inFile = new System.IO.FileStream(file, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.None))
    {
        using (var zipStream1 = new System.IO.Compression.GZipStream(inFile, System.IO.Compression.CompressionMode.Decompress, true))
        {
            while (deCompressFile(destDir, zipStream1))
            {
            }
        }
    }
    // удаляем скаченный архив
    System.IO.File.Delete(file);
}
 

Вложения

Для запуска проектов требуется программа ZennoPoster.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...

Для того чтобы запустить шаблон, откройте программу ZennoPoster. Нажмите кнопку «Добавить», и выберите файл проекта, который хотите запустить.
Подробнее о том, где и как выполняется проект.

Последнее редактирование:

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113
:da::da::da:
 

daymos

Client
Регистрация
11.11.2009
Сообщения
806
Благодарностей
240
Баллы
43
что-то не работает.
Close pipe fault Could not close service with type Zennolab interface library zennoposter iinstance meneger service
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113
это не важная ошибка завершения запроса
смотрите качается ли файл, создается ли папка, распаковывается ли она
ставьте в коде брейки ReturnОм и отлаживайте построчно или кусками)
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)