Как мне организовать специфичные для проекта файлы только для чтения в c # - PullRequest
0 голосов
/ 30 июля 2009

Для моего отдельного небольшого проекта C # требуется умеренное количество (около 100) файлов (XML), которые необходимы для предоставления значений, специфичных для домена, во время выполнения. Они не обязаны быть видимыми для пользователей. Однако мне нужно будет добавлять к ним или периодически обновлять их, что я готов сделать вручную (т.е. я не предусматриваю какой-либо конкретный инструмент, тем более что они могут быть созданы вне системы).

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

Проект по сути автономный (не относится к веб-службам, базам данных или другим сторонним приложениям). Он организован в небольшое количество пространств имен, и вся логика для файлов может быть ограничена одним пространством имен.

========= Я прошу прощения за то, что неясно. Я попробую снова. В приложении Java можно включать файлы ресурсов, которые читаются относительно пути к классам, а не до окончательного * .exe. Я считаю, что есть способ сделать подобное в C #.

========= Я считаю, что я должен использовать что-то, связанное с RESX. Смотрите (файлы RESX и данные xml https://stackoverflow.com/posts/1205872/edit). Я могу поместить строки в файлы resx, но это утомительно и подвержено ошибкам, и я бы предпочел скопировать их в соответствующее место.

Извините, что неясен, но я не совсем уверен, как задать вопрос.

========= Вопрос, кажется, очень близок к ( C # эквивалент getClassLoader (). GetResourceAsStream (...) ). Я хотел бы иметь возможность добавлять файлы в VisualStudio - у меня вопрос: где их разместить и как указать, что они являются ресурсами?

Ответы [ 3 ]

1 голос
/ 30 июля 2009

Если вы поместите их в подпапку относительно вашего исполняемого файла, скажем .\Config, вы сможете получить к ним доступ с помощью File.ReadAllText(@"Config\filename.xml").

Если у вас есть приложение ASP.NET, вы можете поместить их в специальную папку App_Data и получить к ним доступ с помощью File.ReadAllText(Server.MapPath("~/App_Data/filename.xml"))

0 голосов
/ 30 июля 2009

Подробный ответ на http://www.attilan.com/2006/08/accessing_embedded_resources_u.php. Похоже, что файл должен быть указан как EmbeddedResource. Я еще не получил это на работу, но это то, что я хочу.

0 голосов
/ 30 июля 2009

Мне все еще неясно, есть ли у вас Win-формы или веб-проект ... В любом случае, использование относительных имен файлов не обязательно для их перемещения. Я бы предложил добавить в раздел appSettings вашего web.config или app.config файл, содержащий полный путь к вашим xml-файлам. Если они перемещены, все, что вам нужно сделать, это изменить файл конфигурации.

<!-- app/web.config --->
<appSettings>
        <add key="filelocation" value="c:\xmlfiles"/>
</appSettings>

//c# code (in ASP.NET app, for example)
using System.IO;
using System.Xml.Linq;

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        string path = ConfigurationManager.AppSettings["filelocation"];
        DirectoryInfo di = new DirectoryInfo(path);
        List<XDocument> xmlDocs = new List<XDocument>();
        foreach (FileInfo fi in di.GetFiles())
        {
            xmlDocs.Add(XDocument.Load(fi.FullName));
        }
    }
}

Конечно, вы можете знать или не знать имена файлов xml, поэтому вы не можете загружать и читать их одинаково.

В вашем случае кажется совершенно уместным поместить их в вашу папку App_Data, если у вас есть сайт ASP.NET (при условии, что он никогда не будет находиться на более чем одном сервере). Просто будьте осторожны, если вы перечислите «~ / App_Data» в своем файле конфигурации, который вы знаете, чтобы преобразовать его в полный путь, как Дарин сделал с Server.MapPath ().

...