Очередь C# или ServiceBus без зависимостей?

И вот ответ (ы):

1.Использование «чистого» пакетного скрипта для zip / unzip-файла.

Это возможно благодаря ZIP-файла Frank Westlake .CMD и UNZIP.CMD (требуется разрешение администратора и требует FSUTIL и CERTUTIL). Для Win2003 и WinXP потребуется 2003 Admin Tool Pack который установит CERTUTIL. Будьте осторожны, так как синтаксис ZIP.CMD обратный:

ZIP.CMD destination.zip source.file

И он может застегивать только отдельные файлы.

2.Using Shell.Application

ve потратил некоторое время на создание единого jscript / пакетного гибридного сценария для общего использования, который застегивает / распаковывает файлы и каталоги (плюс несколько дополнительных функций). Вот ссылка на него (он стал слишком большим для публикации в ответ). Может использоваться напрямую с расширением .bat и не создавать временные файлы. Я надеюсь, что справочное сообщение достаточно подробно описывает, как его можно использовать.

Некоторые примеры:

// unzip content of a zip to given folder.content of the zip will be not preserved (-keep no).Destination will be not overwritten (-force no)
call zipjs.bat unzip -source C:\myDir\myZip.zip -destination C:\MyDir -keep no -force no

// lists content of a zip file and full paths will be printed (-flat yes)
call zipjs.bat list -source C:\myZip.zip\inZipDir -flat yes

// lists content of a zip file and the content will be list as a tree (-flat no)
call zipjs.bat list -source C:\myZip.zip -flat no

// prints uncompressed size in bytes
zipjs.bat getSize -source C:\myZip.zip

// zips content of folder without the folder itself
call zipjs.bat zipDirItems -source C:\myDir\ -destination C:\MyZip.zip -keep yes -force no

// zips file or a folder (with the folder itslelf)
call zipjs.bat zipItem -source C:\myDir\myFile.txt -destination C:\MyZip.zip -keep yes -force no

// unzips only part of the zip with given path inside
call zipjs.bat unZipItem -source C:\myDir\myZip.zip\InzipDir\InzipFile -destination C:\OtherDir -keep no -force yes
call zipjs.bat unZipItem -source C:\myDir\myZip.zip\InzipDir -destination C:\OtherDir 

// adds content to a zip file
call zipjs.bat addToZip -source C:\some_file -destination C:\myDir\myZip.zip\InzipDir -keep no
call zipjs.bat addToZip -source  C:\some_file -destination C:\myDir\myZip.zip

Некоторые известные проблемы во время zipping:

  • , если на системном диске недостаточно места (обычно C :), сценарий может создавать различные ошибки, чаще всего сценарий останавливается. Это связано с . Shell.Application активно использует% TEMP% папку для сжатия / распаковать данные.
  • Папки и файлы, содержащие символы Unicode в их именах, не могут обрабатываться объектом Shell.Application.
  • Максимальный поддерживаемый размер выпущенных zip-файлов составляет около 8 ГБ в Vista и выше и около 2 ГБ в XP / 2003

Сценарий обнаруживает, что сообщение об ошибке всплывает и останавливает выполнение и сообщает о возможных причинах. В настоящий момент у меня нет способа обнаружить текст внутри всплывающего окна, и дать точную причину отказа.

3. Makecab .

Сжатие файла очень просто - makecab file.txt "file.cab". В конце концов MaxCabinetSize можно было бы увеличить. Для сжатия папки требуется использование директивы DestinationDir (с относительными путями) для каждой (вспомогательной) директории и файлов внутри. Вот сценарий:

;@echo off

;;;;; rem start of the batch part  ;;;;;
;
;for %%a in (/h /help -h -help) do ( 
;   if /I "%~1" equ "%%~a" if "%~2" equ "" (
;       echo compressing directory to cab file  
;       echo Usage:
;       echo(
;       echo %~nx0 "directory" "cabfile"
;       echo(
;       echo to uncompress use:
;       echo EXPAND cabfile -F:* .
;       echo(
;       echo Example:
;       echo(
;       echo %~nx0 "c:\directory\logs" "logs"
;       exit /b 0
;   )
; )
;
; if "%~2" EQU "" (
;   echo invalid arguments.For help use:
;   echo %~nx0 /h
;   exit /b 1
;)
;
; set "dir_to_cab=%~f1"
;
; set "path_to_dir=%~pn1"
; set "dir_name=%~n1" 
; set "drive_of_dir=%~d1"
; set "cab_file=%~2"
;
; if not exist %dir_to_cab%\ (
;   echo no valid directory passed
;   exit /b 1
;)

;
;break>"%tmp%\makecab.dir.ddf"
;
;setlocal enableDelayedExpansion
;for /d /r "%dir_to_cab%" %%a in (*) do (
;   
;   set "_dir=%%~pna"
;   set "destdir=%dir_name%!_dir:%path_to_dir%=!"
;   (echo(.Set DestinationDir=!destdir!>>"%tmp%\makecab.dir.ddf")
;   for %%# in ("%%a\*") do (
;       (echo("%%~f#"  /inf=no>>"%tmp%\makecab.dir.ddf")
;   )
;)
;(echo(.Set DestinationDir=!dir_name!>>"%tmp%\makecab.dir.ddf")
;   for %%# in ("%~f1\*") do (
;       
;       (echo("%%~f#"  /inf=no>>"%tmp%\makecab.dir.ddf")
;   )

;makecab /F "%~f0" /f "%tmp%\makecab.dir.ddf" /d DiskDirectory1=%cd% /d CabinetNameTemplate=%cab_file%.cab
;rem del /q /f "%tmp%\makecab.dir.ddf"
;exit /b %errorlevel%

;;
;;;; rem end of the batch part ;;;;;

;;;; directives part ;;;;;
;;
.New Cabinet
.set GenerateInf=OFF
.Set Cabinet=ON
.Set Compress=ON
.Set UniqueFiles=ON
.Set MaxDiskSize=1215751680;

.set RptFileName=nul
.set InfFileName=nul

.set MaxErrors=1
;;
;;;; end of directives part ;;;;;

Для декомпрессии EXPAND cabfile -F:* . можно использовать. Для извлечения в Unix можно использовать cabextract или 7zip .

4. .NET и GZipStream

Я предпочел Jscript.net, поскольку он позволяет аккуратную гибридизацию с .bat (без токсичных выходов и без временных файлов) .JScript не позволяет передавать ссылку объекта на функцию, поэтому единственный способ заставить его работать - это чтение / запись байтов файлов байтом (так что я полагаю, что это не самый быстрый способ - как буферизованное чтение / запись может быть выполнено?) Снова можно использовать только с отдельными файлами.

@if (@X)==(@Y) @end /* JScript comment
@echo off
setlocal

for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d  /o:-n "%SystemRoot%\Microsoft.NET\Framework\*jsc.exe"') do (
   set "jsc=%%v"
)

if not exist "%~n0.exe" (
    "%jsc%" /nologo /out:"%~n0.exe" "%~dpsfnx0"
)

 %~n0.exe %*

endlocal & exit /b %errorlevel%


*/


import System;
import System.Collections.Generic;
import System.IO;
import System.IO.Compression;



    function CompressFile(source,destination){
        var sourceFile=File.OpenRead(source);
        var destinationFile=File.Create(destination);
        var output = new  GZipStream(destinationFile,CompressionMode.Compress);
        Console.WriteLine("Compressing {0} to {1}.", sourceFile.Name,destinationFile.Name, false);
        var byteR = sourceFile.ReadByte();
        while(byteR !=- 1){
            output.WriteByte(byteR);
            byteR = sourceFile.ReadByte();
        }
        sourceFile.Close();
        output.Flush();
        output.Close();
        destinationFile.Close();
    }

    function UncompressFile(source,destination){
        var sourceFile=File.OpenRead(source);
        var destinationFile=File.Create(destination);

        var input = new GZipStream(sourceFile,
            CompressionMode.Decompress, false);
        Console.WriteLine("Decompressing {0} to {1}.", sourceFile.Name,
                destinationFile.Name);

        var byteR=input.ReadByte();
        while(byteR !== -1){
            destinationFile.WriteByte(byteR);
            byteR=input.ReadByte();
        }
        destinationFile.Close();
        input.Close();


    }

var arguments:String[] = Environment.GetCommandLineArgs();

    function printHelp(){
        Console.WriteLine("Compress and uncompress gzip files:");
        Console.WriteLine("Compress:");
        Console.WriteLine(arguments[0]+" -c source destination");
        Console.WriteLine("Uncompress:");
        Console.WriteLine(arguments[0]+" -u source destination");


    }

if (arguments.length!=4){
    Console.WriteLine("Wrong arguments");
    printHelp();
    Environment.Exit(1);
}

switch (arguments[1]){
    case "-c":

        CompressFile(arguments[2],arguments[3]);
        break;
    case "-u":
        UncompressFile(arguments[2],arguments[3]);
        break;
    default:
        Console.WriteLine("Wrong arguments");
        printHelp();
        Environment.Exit(1);
}

19
задан Joel Martinez 5 February 2009 в 21:31
поделиться

6 ответов

Очереди носорога от Ayende точно, что Вы ищете, это - сообщение в блоге, представляющее его:

http://ayende.com/Blog/archive/2008/08/01/Rhino-Queues.aspx

я думаю, что все ограничения, упомянутые в этом сообщении, были зафиксированы с тех пор.

От сообщения в блоге, каковы очереди носорога:

  • XCopyable, Нулевая администрация, Встроенный, Асинхронный сервис организации очередей
  • Устойчивый перед лицом сетей
  • Система отключений электричества. Поддержка транзакций
  • Быстрый
  • Работы по HTTP
16
ответ дан 30 November 2019 в 04:12
поделиться

В том же духе к предложению ShuggyCoUk, Вы могли подстроить очередь (или очереди) использование Windows встроенная база данных ESENT (уже прибывает установленный с Windows). Существует библиотека доступа управляемого кода (открытый исходный код): http://www.codeplex.com/ManagedEsent . Если Вы придерживаетесь записи / читающий CLOBs или БЛОБЫ, это должно работать просто великолепно. Если Вы хотите быть действительно умными, можно ли использовать NServiceBus, и запись (способствуйте?) ESENT-приправленное устройство хранения данных подписки и транспорты. Существуют некоторые набеги в использование ESENT на блог Ayende также (необходимо будет ввести по абсолютному адресу вокруг его репозитория SVN для сочных битов).

5
ответ дан 30 November 2019 в 04:12
поделиться

Если Вы рады быть:

  1. Windows, конкретный
  2. Ограниченный локальным доменом
  3. Серьезно ограниченный в размере сообщения, поддерживал
  4. , Переносят базовые вызовы win32 в Соглашение о P/Invoke
  5. с опросом себя
  6. , Соглашение со взломами должно было позволить назад и вперед коммуникацию
  7. , Соглашение с общей конфигурацией должно было сохранить имена в синхронизации

Затем быстрая обертка вокруг окон , MailSlot API мог бы быть достаточным.

Этот простым примером является разумное основание для запуска.

Эта статья имеет немного дополнительной информации, но предполагает, что вариант использования через управление (а не Компонент, как это должно быть), а также некоторую плохую интеграцию WinForms так нужно рассмотреть для несущественного чтения, а не основания для любой библиотеки.

Эта статья является C++, но более высокого стандарта (и комментатор расширил его для поддержки пакетной обработки больших сообщений в несколько меньших).

Вы получаете 424 байта (так с символами.Net 212), можно хотеть опуститься до ASCII для удвоения полезной длины сообщения, если Вы говорите текст.

Примечание, что несмотря на его простоту, ограничения и отсутствие функций это действительно обеспечивает многоадресную доставку, что-то часто комплекс к слою на протоколе "точка-точка" самостоятельно.

2
ответ дан 30 November 2019 в 04:12
поделиться

Этот сообщение ayende обеспечивает и интересное сравнение трех сервисных шин. Мы используем NServiceBus и думаем, не ли ясно, что Udi Dahan ответил бы на то, как Вы включите независимую очередь.

Мы работаем с помощью MSMQ счастливо, но существуют другие опции, и в теории это должно быть открыто для практически чего-либо, учитывая, что можно потерять некоторую надежность и длительность в зависимости от выбора.

2
ответ дан 30 November 2019 в 04:12
поделиться

Почему не Amazon служба сообщений Простой Сервис Очереди?

2
ответ дан 30 November 2019 в 04:12
поделиться

Мы переместили наши проекты от MSMQ до ActiveMQ. его действительно лучше :)
ActiveMQ очередь открытого исходного кода , на основе веб-сервера Apache.
Мы использовали его в производстве на высоком часто рабочий процесс данных, где msmq имеют большую проблему (мы работаем с msmq год)
, реализация до-диеза nms

1
ответ дан 30 November 2019 в 04:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: