Файл.NET. Существует не работает в папке Windows\System32\Drivers?

Некоторые из этих ответов очень хороши. Я постараюсь заполнить некоторые вещи, которые они не упомянули.

EDI - это набор стандартов, наиболее распространенными из которых являются:

  • ANSI X12 (популярный в штатах)
  • EDIFACT (популярный в Европе)

Похоже, вы смотрите на версию X12 4010. Это наиболее широко используемая (по моему опыту, во всяком случае) версия. Есть много разных версий.

Файл, или, по сути, «обмен», состоит из сегментов и элементов (и иногда подэлементов). Каждый сегмент начинается с двух- или трехзначного идентификатора (ISA, GS, ST, N1, REF).

Структура всех документов начинается и заканчивается конвертом. Конверт обычно состоит из сегмента ISA и сегментов GS. В каждом файле может быть более одного сегмента GS, но в каждом файле должен быть только один сегмент ISA (обратите внимание, что не все играют по правилам).

ISA - это особый сегмент. В то время как все остальные сегменты разделены и, следовательно, могут иметь различную длину, сегмент ISA имеет фиксированную ширину. Это потому, что он говорит вам, как прочитать остальную часть файла.

Начните с последних трех символов сегмента ISA. Они расскажут вам разделитель элемента, разделитель подэлемента и разделитель сегмента. Вот пример строки ISA.

ISA: 00:: 00:: 01: 1515151515: 01: 5151515151: 041201: 1217: U: 00403: 000032123: 0: P: * ~

В этом случае «:» является разделитель элемента "*" является разделителем субэлемента, а "~" разделителем сегмента. Гораздо проще, если вы просто пытаетесь просмотреть файл, чтобы поставить разрывы строк после каждого разделителя сегмента (~).

ISA также сообщает вам, от кого и из какого документа, какая версия (00403, также известная как 4030) и контрольный номер обмена (0000321233). Другие вещи, вероятно, не важны для вас на этом этапе.

Этот документ от отправителя "01: 1515151515" и от получателя "01: 5151515151". Так что с "01:"? Что ж, это вводит важную концепцию в EDI, классификатор. Несколько элементов имеют квалификаторы, которые сообщают вам, к какому типу данных относится следующий элемент. В этом случае 01 должен быть числом Данна и Брэдстрита. Другими квалификаторами для элементов ISA05 и ISA07 являются 12 для номера телефона и ZZ для «пользовательского». Вы найдете концепцию классификаторов во всех сегментах EDI. Приличное эмпирическое правило: если это два символа, это квалификатор. Чтобы узнать, что означают все квалификаторы, вам понадобится руководство по стандартам (либо в печатном виде из органа по стандартам EDI, либо в некотором программном обеспечении).

Следующая строка - GS. Это функциональная группа (способ группировки похожих документов в рамках обмена). Например, у вас может быть несколько заказов на покупку и несколько функциональных подтверждений в ISA. Они должны быть помещены в отдельные функциональные группы (сегменты GS). Вы можете выяснить, какие типы документов находятся в сегменте GS, посмотрев на первый элемент GS01.

GS: PO: 9988776655: 1122334455: 20041201: 1217: 128: X: 004030

Помимо типа документа, вы снова можете видеть от (9988776655) и до (1122334455). На этот раз они используют разные идентификаторы, что является законным, потому что вы можете получать обмен от имени кого-то другого (например, если вы посредник). Вы также можете увидеть номер версии снова, на этот раз с завершающим «0» (0004030). Используйте значительную логику цифр, чтобы убрать начальные нули. Почему здесь есть дополнительный ноль, а не в ISA? Я не знаю. Наконец, этот сегмент GS также имеет свой собственный идентификатор 128.

1116 Вот и все для начала конверта. После этого будет цикл документов, начинающийся с ST. В этом случае все они будут PO, которые имеют код (850), поэтому строка будет начинаться с ST: 850: blablabla

Материал конверта заканчивается сегментом GE, который ссылается на идентификатор GS (128). ) так что вы знаете, какой сегмент закрывается. Затем наступает МЭА, которое аналогичным образом закрывает МСА.

GE: 1: 128 ~ IEA: 1: 000032123 ~

Это обзор структуры и того, как ее читать. Чтобы понять это, вам понадобится справочник или программное обеспечение, чтобы вы понимали коды, много-много времени и много-много практики. Удачи, и пишите снова, если у вас есть более конкретные вопросы.

7
задан Paul Alexander 26 May 2009 в 21:26
поделиться

5 ответов

Да, виртуализация происходит на очень низком уровне. Метод File.Exists в основном вызывает метод Win32 CreateFile и проверяет наличие ошибок. CreateFile перенаправляется подсистемой WOW.

Вы можете временно отключить виртуализацию перед вызовом.

[DllImport( "kernel32", CharSet=CharSet.Unicode, SetLastError=true )]
public static extern bool Wow64DisableWow64FsRedirection( ref IntPtr oldValue );

[DllImport( "kernel32", CharSet=CharSet.Unicode, SetLastError=true )]
public static extern bool Wow64RevertWow64FsRedirection( IntPtr oldValue );

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

public static bool FileExists( string path )
{
    if( File.Exists( path ) ) return true;
    IntPtr oldValue = IntPtr.Zero;
    try
    {
        if( Environment.GetEnvironmentVariable( "PROCESSOR_ARCHITEW6432" ) == null )
            return false;

        Wow64DisableWow64FsRedirection( ref oldValue );
        if( File.Exists( path ) ) return true;

        return false;
    }
    finally
    {
        if( oldValue != IntPtr.Zero )
            Wow64RevertWow64FsRedirection( ref oldValue );            
    }   
}

Обновление: Вам также может потребоваться проверить версию ОС перед отключением перенаправления WOW, потому что более ранние версии XP (я полагаю, до SP2) не предоставляют эти методы.

Обновление 2: Добавлена ​​проверка ОС на 64-битность. Все 64-битные версии ОС реализуют эти методы, и вам нужно отключить состояние, только если вы работаете в 64-битной ОС.

10
ответ дан 6 December 2019 в 15:29
поделиться

Ваш процесс 32-битный или 64-битный? а драйвера 64 или 32? Я понимаю, что, возможно, ОС вашего хоста вместо этого перенаправляет вас в папку Wow64.

2
ответ дан 6 December 2019 в 15:29
поделиться

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

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
        <security>
            <requestedPrivileges>
                <requestedExecutionLevel level="asInvoker" uiAccess="false"/>
            </requestedPrivileges>
        </security>
    </trustInfo>
</assembly>

Однако, если вам нужно записать в эти папки, вам придется запросить права администратора . Для этого измените level = "asInvoker" на level = "requireAdministrator" в xml.

2
ответ дан 6 December 2019 в 15:29
поделиться

Это проблема виртуализации - файла просто нет. Вам нужно будет искать его в папке, содержащей виртуализированные файлы.

0
ответ дан 6 December 2019 в 15:29
поделиться

Если у вас есть права, почему бы вам не попытаться создать файл в том же месте в вашем коде и посмотреть, где он закончится? Как предположил другой, Windows могла бы перенаправить ваш вызов на основе нескольких настроек.

Также вы можете попробовать выполнить DirectoryInfo и перечислить содержащиеся в нем файлы, чтобы увидеть, не выглядит ли что-нибудь знакомым.

0
ответ дан 6 December 2019 в 15:29
поделиться
Другие вопросы по тегам:

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