Исключение в двухстрочной программе Xerces

Следующий код дает мне исключение в строке XMLFormatTarget, но если я изменю строку с "C:/test.xml" на "test.xml", она будет работать нормально.

// test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <xercesc/util/XMLString.hpp>
#include <xercesc/framework/LocalFileFormatTarget.hpp>

using namespace xercesc;

int main()
{
    XMLPlatformUtils::Initialize();

    XMLFormatTarget *formatTarget = new LocalFileFormatTarget("C:/test.xml"); 

    return 0;
}

[править] Исключение Xerces:

Сообщение об ошибке: невозможно открыть файл C: \ test.xml

Исключение для Windows:

Доступ запрещен


person Gungho    schedule 22.06.2010    source источник
comment
Пожалуйста, помогите нам помочь вам: какое у вас исключение?   -  person ereOn    schedule 22.06.2010


Ответы (3)


Возможно, у вас недостаточно прав для записи в C:\. В таком случае Xerces может сообщить об ошибке, создав исключение.

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


Возможно, это тоже как-то связано с разделителями каталогов:

XMLFormatTarget *formatTarget = new LocalFileFormatTarget("C:\\test.xml");

В Windows разделителями каталогов являются обратная косая черта «\». Некоторым библиотекам все равно (и я никогда не использовал Xerces, поэтому не могу сказать). В C и C++ обратная косая черта также является escape-символом, поэтому вы должны удвоить ее, если хотите, чтобы в строке был буквальный символ "\".

Кроме того, если вы сообщите нам, какое исключение произошло, это поможет нам еще больше.


Не имеет прямого отношения, но из вашего кода кажется, что вы никогда не delete formatTarget. Я предполагаю, что это образец кода, но если это не так, вы должны добавить в свой код следующую строку:

delete formatTarget;

Или используйте вместо него указатель с областью действия:

boost::scoped_ptr<XMLFormatTarget> formatTarget(new LocalFileFormatTarget("C:\\test.xml"));

Чтобы избежать утечки памяти.

person ereOn    schedule 22.06.2010
comment
Я тоже не знаю двух Ксерксов, но что не так с LocalFileFormatTarget formatTarget("C:\\test.xml");? - person sbi; 22.06.2010
comment
Спасибо за ответ ereOn, я все еще получаю исключение с C: \\ test.xml. Я знаю, что необходимо освободить formatTarget, я просто хотел опубликовать минимально возможное количество кода для воспроизведения проблемы. Я отправлю ответ за исключением. - person Gungho; 22.06.2010
comment
Дело не в том, что некоторым библиотекам все равно, сам WinAPI не заботится, и по большей части вы можете использовать \ и / взаимозаменяемо в Windows. - person sbk; 22.06.2010
comment
@sbi: В двойных обратных косых чертах нет ничего плохого, это моя точка зрения. Возможно, вы неправильно прочитали вопрос или мой ответ? @sbk: Я видел много библиотек, которые заботятся. Возможно, эти библиотеки плохо спроектированы, но это уже другая тема. В любом случае, поскольку я не знаю Ксерса, я не могу сказать наверняка. - person ereOn; 22.06.2010
comment
Обновлен исходный вопрос с исключением. - person Gungho; 22.06.2010
comment
@Gungho: Я уже обновил свой ответ, добавив еще одну возможность;) И, похоже, я был прав: у вас, вероятно, недостаточно прав для записи непосредственно в `C:`. - person ereOn; 22.06.2010
comment
Да! это была проблема с записью в C: / под Windows Vista, без проблем с записью по другим путям или записью в C: / под Windows XP. Спасибо за вашу помощь. - person Gungho; 22.06.2010

Попробуйте перекодировать имя файла:

// Convert the path into Xerces compatible XMLCh*. 
XMLCh *tempFilePath = XMLString::transcode(filePath.c_str()); 

// Specify the target for the XML output. 
XMLFormatTarget *formatTarget = new LocalFileFormatTarget(tempFilePath);

согласно этому ответу на аналогичный вопрос .

person jon-hanson    schedule 22.06.2010

Если вы используете только test.xml, вы указываете путь относительно текущего рабочего каталога (обычно, откуда была запущена программа). Поэтому, если ваша программа не находится непосредственно на вашем диске C :, два запуска могут указывать на разные файлы. C:\test.xml могла иметь ошибку, но C:\Path\to\your\program\test.xml правильно, поэтому последнее не является исключением.

В любом случае, как сказал ereOn, было бы полезно, если бы мы знали, какое исключение сгенерировано.

person king_nak    schedule 22.06.2010
comment
Спасибо за ответ king_nak, файл test.xml не существует ни для рабочего, ни для неработающего примера. этот фрагмент кода является частью программы, которая фактически создает test.xml и заполняет его. - person Gungho; 22.06.2010