Некоторые из этих ответов очень хороши. Я постараюсь заполнить некоторые вещи, которые они не упомянули.
EDI - это набор стандартов, наиболее распространенными из которых являются:
Похоже, вы смотрите на версию 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 ~
Это обзор структуры и того, как ее читать. Чтобы понять это, вам понадобится справочник или программное обеспечение, чтобы вы понимали коды, много-много времени и много-много практики. Удачи, и пишите снова, если у вас есть более конкретные вопросы.
Да, виртуализация происходит на очень низком уровне. Метод 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-битной ОС.
Ваш процесс 32-битный или 64-битный? а драйвера 64 или 32? Я понимаю, что, возможно, ОС вашего хоста вместо этого перенаправляет вас в папку Wow64.
Вы пробовали отключить виртуализацию папок для своего приложения? Вам потребуется добавить файл манифеста, содержащий:
<?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.
Это проблема виртуализации - файла просто нет. Вам нужно будет искать его в папке, содержащей виртуализированные файлы.
Если у вас есть права, почему бы вам не попытаться создать файл в том же месте в вашем коде и посмотреть, где он закончится? Как предположил другой, Windows могла бы перенаправить ваш вызов на основе нескольких настроек.
Также вы можете попробовать выполнить DirectoryInfo и перечислить содержащиеся в нем файлы, чтобы увидеть, не выглядит ли что-нибудь знакомым.