Как я различаю 'текстовые' файлы и 'двоичный файл'?

Несколько вещей:

  • В вашем методе MakeItWork() есть код, который «вызывает» метод с использованием имени интерфейса - даже не уверен, как он будет компилироваться. Вам нужно использовать объект класса, который реализует этот интерфейс, чтобы фактически делать вызовы методов во время выполнения. Например, в вашем классе DoWork у вас может быть конструктор, запрашивающий экземпляр класса, который реализует интерфейс IEmailService и сохраняет его для будущего использования в других методах.

  • Во-вторых, в коллекцию Services вы добавляете зависимость «Scoped» (в методе ConfigureServices). Зависимость "scoped" создается только по запросу (http), обычно через вызовы контроллеров. Исходя из вашего кода и вашего объяснения, похоже, что вы хотите добавить объект Singleton для вашего интерфейса IEmailService. Таким образом, вместо добавления зависимости Scoped используйте AddSingleton - как вы уже сделали, вы также можете создать конкретный объект в вызове AddSingleton - это означает, что этот объект будет предоставляться каждый раз, когда вы его запрашиваете (через конструкторы классов например). Если вы используете его как синглтон, вы также должны убедиться, что он является потокобезопасным. Кроме того, вы также можете добавить зависимость, используя AddTransient - если вы используете это, новый объект будет создаваться каждый раз, когда вы запрашиваете его.

Обновление: Пример кода

Измените ваши ConfigureServices, чтобы сделать EmailService как переходный (это означает новый объект каждый раз, когда запрашивается эта служба) :

public void ConfigureServices(IServiceCollection services)
{
   ...
   services.Configure<EmailSettings>(Configuration.GetSection("EmailSettings"));
   services.AddTransient<IEmailService, EmailService>();
   ...
}

Ваш класс «DoWork» должен запросить службу EMail в конструкторе:

public class DoWork()
{

private IEmailService _emailService;

//Dependency should be injected here
public DoWork(IEmailService emailService)
{
    _emailService = emailService;
}


public MakeItWork()
{
   try
   {...}
   catch (exception ex)
   {
      //Use the saved email service object to do your work
      _emailService.SendErrorEmail("BAL - MakeItWork", ex)
   }
}

}

Это не заканчивается здесь. Остается вопрос, как вы собираетесь создать объект класса DoWork. Для этого одной из идей является создание интерфейса для самого класса DoWork, а затем настройка контейнера для этого интерфейса. Затем, где бы вы ни захотели использовать реализацию DoWork, вы можете «запросить» интерфейс для DoWork. Или используйте контейнер непосредственно для создания экземпляра.

61
задан Mechanical snail 6 August 2012 в 07:23
поделиться

7 ответов

Программное обеспечение электронной таблицы моя компания делает чтения многими форматами двоичного файла, а также текстовыми файлами.

Мы сначала смотрим на первые несколько байтов для магическое число , который мы распознаем. Если мы не распознаем магическое число ни одного из двоичных типов, мы читаем, то мы смотрим на до первых 2K байтов файла, чтобы видеть, кажется ли это, UTF-8, UTF-16 или текстовый файл, закодированный в токе кодовая страница хостовой операционной системы. Если это не передает ни один из этих тестов, мы предполагаем, что это не файл, с которым мы можем иметь дело и выдать соответствующее исключение.

14
ответ дан istvanp 24 November 2019 в 17:17
поделиться

Можно использовать эти file команда. Это делает набор тестов на файле (man file), чтобы решить, является ли это двоичным или текст. Можно посмотреть на его исходный код, если необходимо сделать это от C.

file README
README: ASCII English text, with very long lines

file /bin/bash
/bin/bash: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), stripped
62
ответ дан Ioannis Filippidis 24 November 2019 в 17:17
поделиться

Можно определить тип MIME файла с

file --mime FILENAME

, стенография file -i на Linux и file -I (капитал i) на macOS (см. комментарии).

, Если это запускается с text/, это - текст, в других отношениях двоичный. Единственным исключением являются приложения XML. Можно соответствовать тем, которые путем поиска +xml в конце типа файла.

15
ответ дан phihag 24 November 2019 в 17:17
поделиться

Ну, если Вы просто осматриваете весь файл, посмотрите, является ли каждый символ печатаемым с isprint(c). Это становится немного более сложным для Unicode.

Для различения unicode текстового файла MSDN дает некоторый большой совет относительно того, что сделать .

суть его должна сначала осмотреть до первых четырех байтов:

EF BB BF     UTF-8 
FF FE        UTF-16, little endian 
FE FF        UTF-16, big endian 
FF FE 00 00  UTF-32, little endian 
00 00 FE FF  UTF-32, big-endian 

, Который скажет Вам кодирование. Затем Вы хотели бы использовать iswprint(c) для остальной части символов в текстовом файле. Для UTF-8 и UTF-16, необходимо проанализировать данные вручную, так как отдельный символ может быть представлен переменным числом байтов. Кроме того, если Вы будете действительно анальными, то Вы захотите использовать вариант локали iswprint, если это будет доступно на Вашей платформе.

3
ответ дан MSN 24 November 2019 в 17:17
поделиться

Большинство программ, которые пытаются сказать различие, использует эвристику, такую как исследование первого n байты файла и наблюдения, если те байты весь квалифицируют как 'текст' или не (т.е., они все находятся в пределах диапазона печатаемого ASCII charcters). Для более прекрасного distiction в подобных UNIX системах всегда существует команда 'файла'.

2
ответ дан dwc 24 November 2019 в 17:17
поделиться

Одна простая проверка состоит в том, если она имеет \0 символы. Текстовые файлы не имеют их.

1
ответ дан Georg Schölly 24 November 2019 в 17:17
поделиться

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

Этот файл, названный волшебством, исторически хранился в / и т.д., хотя это может быть в/usr/share на некоторых дистрибутивах. Волшебный файл определяет смещения значений, которые, как известно, существовали в файле, и может затем исследовать эти местоположения для определения типа файла.

структура и описание волшебного файла могут быть найдены путем консалтинга со страницей соответствующего руководства (волшебство человека)

Что касается реализации, хорошо который может быть найден в сам file.c, однако соответствующая часть команды файла, которая определяет, является ли это читаемым текстом или не является следующим

/* Make sure we are dealing with ascii text before looking for tokens */
    for (i = 0; i < nbytes - 1; i++) {
        if (!isascii(buf[i]) ||
            (iscntrl(buf[i]) && !isspace(buf[i]) &&
             buf[i] != '\b' && buf[i] != '\032' && buf[i] != '\033'
            )
           )
            return 0;   /* not all ASCII */
    }
1
ответ дан Steve Weet 24 November 2019 в 17:17
поделиться
Другие вопросы по тегам:

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