Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / StreamReader не дает доступ к файлу другим процессам / 4 сообщений из 4, страница 1 из 1
13.05.2013, 06:24
    #38254666
greshnik_05
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
StreamReader не дает доступ к файлу другим процессам
День Добрый!!!
Имеется такой код который в шаблоне ворда (2007) меняет одни значения на другие
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
using (WordprocessingDocument wordDococument = WordprocessingDocument.Open(fileName, true))
                {
                    string docText = null;
                    using (StreamReader sr = new StreamReader(wordDococument.MainDocumentPart.GetStream()))
                    {
                        docText = sr.ReadToEnd();
                    }

                    //в шаблоне заменяем метки на значения
                    for (int i = 0; i < ArrayForms[listForms.SelectedIndex].Fields.Count; i++)
                    {
                        Regex regexText = new Regex("{" + ArrayForms[listForms.SelectedIndex].Fields[i].Name + "}");
                        docText = regexText.Replace(docText, DataFormDataGridView.Rows[DataFormDataGridView.CurrentCell.RowIndex].Cells[i].Value.ToString());
                    }
                    
                    //сохраняем документ
                    using (StreamWriter sw = new StreamWriter(wordDococument.MainDocumentPart.GetStream(FileMode.Create)))
                    {
                        sw.Write(docText);
                    }
                    //открывает документ
                    Process.Start(fileName);


Если вызвать Process.Start(fileName); до сохранения пишет что файл занят другим процессом, т.е. StreamReader'ом.
Зачем мне нужно открывать файл до сохранения? Затем чтоб После замены меток на нужные значения документ открылся и пользователь сам сохранил где ему нужно и под тем именем который ему больше нравится.
А если вначале сохранить а потом открыть документ, то получается что прога все изменения сохранила в шаблоне что приводит к порче шаблона.
Был тут http://www.sql.ru/forum/585228/streamreader-derzhit-fayl но не понял каким образом FileStream применить у себя.
В общем вопрос таков: как сделать так чтоб StreamReader не держал файл или чем его заменить мне?
ЗЫ. Работа с вордом как вы догадались осуществляется через OpenXml, а не через COM
...
Рейтинг: 0 / 0
13.05.2013, 06:35
    #38254670
greshnik_05
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
StreamReader не дает доступ к файлу другим процессам
Делал таким образом
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
using (WordprocessingDocument wordDococument = WordprocessingDocument.Open(fileName, true))
                {
                    string docText = null;
                    //using (StreamReader sr = new StreamReader(wordDococument.MainDocumentPart.GetStream()))
                    //{
                    //    docText = sr.ReadToEnd();
                    //}

                    FileInfo fInfo = new FileInfo(fileName);
                    using (FileStream fStream = fInfo.Open(FileMode.Open, FileAccess.Read, FileShare.Read))
                    {
                        byte[] result = new byte[fInfo.Length];
                        fStream.Read(result, 0, (int)fInfo.Length);
                        docText = Encoding.Default.GetString(result);
                    }

                    //в шаблоне заменяем метки на значения
                    for (int i = 0; i < ArrayForms[listForms.SelectedIndex].Fields.Count; i++)
                    {
                        Regex regexText = new Regex("{" + ArrayForms[listForms.SelectedIndex].Fields[i].Name + "}");
                        docText = regexText.Replace(docText, DataFormDataGridView.Rows[DataFormDataGridView.CurrentCell.RowIndex].Cells[i].Value.ToString());
                    }
                    
                    ////сохраняем документ
                    //using (StreamWriter sw = new StreamWriter(wordDococument.MainDocumentPart.GetStream(FileMode.Create)))
                    //{
                    //    sw.Write(docText);
                    //}
                    //открывает документ
                    Process.Start(fileName);


Выходит ошибка : "Процесс не может получить доступ к файлу , так как этот файл занят другим процессом". Видимо это происходит когда FileStream пытается открыть файл, который уже открыт WordprocessingDocument'ом.
...
Рейтинг: 0 / 0
14.05.2013, 12:15
    #38256392
greshnik_05
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
StreamReader не дает доступ к файлу другим процессам
неужели даже идей нет ни каких???
...
Рейтинг: 0 / 0
14.05.2013, 13:36
    #38256536
carrotik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
StreamReader не дает доступ к файлу другим процессам
greshnik_05,

... у StreamReader-a есть метод Close(), это во-первых, а во вторых, чтобы не портить шаблон, можно содать новый объект wordDocument, записать изменения в него, и пусть пользователь как хочет с ним упражняется ....
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / StreamReader не дает доступ к файлу другим процессам / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]