- Регистрация
- 13.01.2009
- Сообщения
- 2 285
- Благодарностей
- 2 730
- Баллы
- 113
Кто-то уже продает проекты, кто-то только собирается, а кому-то надо сделать переносимые проекты между разными компьютерами.
Проекты обычно работают с каким-то набором данных и надо их распространять вместе с проектом.
Делается это примерно так. Создаем архив со структурой данных, заливаем на сервер, чтобы файл был доступен по http, потом ваш шаблон должен проверять, есть ли директория и если нет, то скачать и распаковать.
Вот 2 простых C# снипета, которые помогут вам это сделать.
Первый снипет поможет вам упаковать вашу директорию с файлами проекта
Второй снипет поможет распаковать
Проекты обычно работают с каким-то набором данных и надо их распространять вместе с проектом.
Делается это примерно так. Создаем архив со структурой данных, заливаем на сервер, чтобы файл был доступен по 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);
}
Вложения
-
15,4 КБ Просмотры: 309
Для запуска проектов требуется программа ZennoPoster.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...
Для того чтобы запустить шаблон, откройте программу ZennoPoster. Нажмите кнопку «Добавить», и выберите файл проекта, который хотите запустить.
Подробнее о том, где и как выполняется проект.
Последнее редактирование: