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

  • Автор темы Автор темы darkdiver
  • Дата начала Дата начала

darkdiver

Administrator
Команда форума
Регистрация
13.01.2009
Сообщения
2 285
Реакции
2 732
Баллы
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);
}
 

Вложения

Последнее редактирование:
:da::da::da:
 
что-то не работает.
Close pipe fault Could not close service with type Zennolab interface library zennoposter iinstance meneger service
 
это не важная ошибка завершения запроса
смотрите качается ли файл, создается ли папка, распаковывается ли она
ставьте в коде брейки ReturnОм и отлаживайте построчно или кусками)
 

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