Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
 Аватар для Wladimir2003
0 / 0 / 0
Регистрация: 27.11.2020
Сообщений: 83
SQLite

В чем проблема, выдает исключение (файл не найден)

21.06.2022, 15:02. Показов 1249. Ответов 11

Студворк — интернет-сервис помощи студентам
Делаю проект, в котором нужно подключить внешнюю БД, в моем случае SQLite, к проекту, и далее делать с ней определенные операции. В ходе создания подключения к БД столкнулся с проблемой - исключением:
Code
1
System.IO.FileNotFoundException: 'Could not find file "/data/user/0/com.companyname.hellpapp/files/.local/share/Friends.db3"'
которое вполне ожидаемо возникает на 28 строчке кода.

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
31
32
33
34
35
36
37
38
39
using System;
using System.IO;
using Xamarin.Forms;
using System.Reflection;
 
namespace HellpApp
{
    public partial class App : Application
    {
        public const string DATABASE_NAME = "Friends.db3";
        public static FriendAsyncRepository database;
        public static FriendAsyncRepository Database
        {
            get
            {
                if (database == null)
                {
                    // путь, по которому будет находиться база данных
                    string dbPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), DATABASE_NAME);
                    // если база данных не существует (еще не скопирована)
                    if (!File.Exists(dbPath))
                    {
                        // получаем текущую сборку
                        var assembly = IntrospectionExtensions.GetTypeInfo(typeof(App)).Assembly;
                        // берем из нее ресурс базы данных и создаем из него поток
                        using (Stream stream = assembly.GetManifestResourceStream($"HellpApp.{DATABASE_NAME}"))
                        {
                            using (FileStream fs = new FileStream(dbPath, FileMode.Open))
                            {
                                stream.CopyTo(fs);  // копируем файл базы данных в нужное нам место
                                fs.Flush();
                            }
                        }
                    }
                    database = new FriendAsyncRepository(dbPath);
                }
                return database;
            }
        }
Миниатюры
В чем проблема, выдает исключение (файл не найден)  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.06.2022, 15:02
Ответы с готовыми решениями:

Выдает ошибку, а я не могу понять в чем проблема. В чем проблема, скажите пожалуйста!
dx=0.0005; epsillon=0.00002; i=0; for x= 0:0.0005:3 i=i+1; if x<1 y (i)=-1; elseif x<2 S=0; ...

Выдает исключение, в чем ошибка?
namespace ConsoleApplication4 { class Program { static void Main(string args) { string s =...

не могу понять в чём проблема. выдаёт ошибку, что Серьезность Код Описание Проект Файл Строка Состояние подавления Ошибк
#include <iostream> using namespace std; struct date //создаем еще одну структуру, чтобы вложить ее в структуру building // дата...

11
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
21.06.2022, 15:40
Wladimir2003, замените FileMode.Open на FileMode.Create.

Добавлено через 3 минуты
Документация
Open: Specifies that the operating system should open an existing file. The ability to open the file is dependent on the value specified by the FileAccess enumeration. A FileNotFoundException exception is thrown if the file does not exist.

Create: Specifies that the operating system should create a new file. If the file already exists, it will be overwritten. This requires Write permission. FileMode.Create is equivalent to requesting that if the file does not exist, use CreateNew; otherwise, use Truncate. If the file already exists but is a hidden file, an UnauthorizedAccessException exception is thrown.
0
 Аватар для Wladimir2003
0 / 0 / 0
Регистрация: 27.11.2020
Сообщений: 83
21.06.2022, 15:41  [ТС]
OwenGlendower, изначально и было OpenOrCreate, но все сводилось к тому, что по всей видимости не находил файл и просто создавал новый, следовательно он был пустой, а мне этого не нужно. Я того и добиваюсь, что бы данные из БД попали ко мне в программу.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
21.06.2022, 15:50
Цитата Сообщение от Wladimir2003 Посмотреть сообщение
по всей видимости не находил файл и просто создавал новый, следовательно он был пустой
Если файл в ресурсах не пустой, то и новый файл на диске будет непустым. Файл в ресурсах пустой или нет?

Цитата Сообщение от Wladimir2003 Посмотреть сообщение
Я того и добиваюсь, что бы данные из БД попали ко мне в программу.
Приведенный код должен сработать. Опишите точнее что происходит.

Цитата Сообщение от Wladimir2003 Посмотреть сообщение
изначально и было OpenOrCreate
Т.к. перед этим стоит проверка на существование файла, то OpenOrCreate можно тут использовать, но лучше все-таки Create т.к. цель создать новый файл.
0
 Аватар для Wladimir2003
0 / 0 / 0
Регистрация: 27.11.2020
Сообщений: 83
21.06.2022, 16:21  [ТС]
OwenGlendower, файл в ресурсах непустой, после того как поменял на Create данных все равно нет.

Насколько я понимаю, раз он не может именно найти файл БД, значит он не сможет создать новый с данными старого, и поэтому будет создавать пустую БД, которая работает, если в нее в интерфейсе подобавлять всякого разного, то она все сохраняет, и при повторных запусках все отображается. Но поскольку сам я такие вещи делать не умею, а приходится, я скопировал пример с интернета, то мне именно нужно что бы данные считывались из файла, так как программа вообще не предусматривает возможности ввода данных в БД, а лишь выводит уже содержащиеся данные.
Миниатюры
В чем проблема, выдает исключение (файл не найден)  
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
21.06.2022, 16:43
Wladimir2003, ничего не понял, если честно. На скриншоте видно что в таблице Friend есть данные. Значит при создании файла на основании ресурса они тоже должны быть. Смущает только что на скриншоте Windows-style путь E:\Курсовой проект\..., а в сообщении об ошибке Unix-style путь /data/user/0/com.companyname.hellpapp/files/.local/share/Friends.db3. Как так получается? Путь на диске E: точно соответствует тому что вы открываете в VS?
0
 Аватар для Wladimir2003
0 / 0 / 0
Регистрация: 27.11.2020
Сообщений: 83
21.06.2022, 17:02  [ТС]
OwenGlendower, меня это тоже смущает. Файл в каталоге появляется не сам, его нужно добавлять вручную, назначать как встроенный ресурс, может быть в ходе этого процесса происходит копирование в расположение, которое выводит dbPath и, соответственно сообщение об ошибке.
0
 Аватар для Wladimir2003
0 / 0 / 0
Регистрация: 27.11.2020
Сообщений: 83
22.06.2022, 19:39  [ТС]
OwenGlendower, вот есть строчка кода
C#
1
 string dbPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),DATABASE_NAME);
Она, как я понял, имеет результат в виде пути в специальную папку (LocalApplicationData), хотя сама БД находится не там, а в папке Assets. Получается, путь "липовый", следовательно файл там не находится, и все следующие строчки кода:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if (!File.Exists(dbPath))
                    {
                        // получаем текущую сборку
                        var assembly = IntrospectionExtensions.GetTypeInfo(typeof(App)).Assembly;
                        // берем из нее ресурс базы данных и создаем из него поток
                        using (Stream stream = assembly.GetManifestResourceStream($"ESA.{DATABASE_NAME}"))
                        {
                            using (FileStream fs = new FileStream(dbPath, FileMode.OpenOrCreate))
                            {
                                stream.CopyTo(fs);  // копируем файл базы данных в нужное нам место
                                fs.Flush();
                            }
                        }
                    }
ведут к созданию пустого файла. Или я в чем-то не прав?
Миниатюры
В чем проблема, выдает исключение (файл не найден)  
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
22.06.2022, 20:26
Wladimir2003, если база находится в папке Assets, то зачем вы её добавили в ресурсы своего проекта и написали код который сохраняет его в LocalApplicationData?

Добавлено через 1 минуту
Почему бы сразу не использовать правильный путь без трюков с ресурсами?
0
 Аватар для Wladimir2003
0 / 0 / 0
Регистрация: 27.11.2020
Сообщений: 83
22.06.2022, 20:43  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
если база находится в папке Assets, то зачем вы её добавили в ресурсы своего проекта и написали код который сохраняет его в LocalApplicationData?
А это потому, что я вообще не шарю в этом. Этот код я нашел в одном из руководств по этой теме.
Как я понял, БД там и должна быть. А копирует он туда этот файл, читая указанный мной. Но вот почему он его не находит, мне не понятно. От слова совсем. Когда этот файл был в основном каталоге приложения, проблема была точно такая же.
Я до этого момента считал, что pathDB указывает путь до БД. А она указывает расположение создаваемого кодом ниже нового файла. Следовательно, проблема в этих строчках:
C#
1
2
3
4
5
using (Stream stream = assembly.GetManifestResourceStream($"ESA.{DATABASE_NAME}"))
                        {
                            using (FileStream fs = new FileStream(dbPath, FileMode.OpenOrCreate))
                            {
                                stream.CopyTo(fs);  // копируем файл базы данных в нужное нам место
.

Ну а как решать эту проблему я не знаю.
В отладке переменная assembly вообще не определена.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18298 / 14222 / 5368
Регистрация: 17.03.2014
Сообщений: 28,900
Записей в блоге: 1
22.06.2022, 20:53
Wladimir2003, я только сейчас заметил что вы используете Xamarin. Теперь понятно откуда разные пути появляются. Я не специалист в этой области. Вам нужно узнать как работать с файлами из папки Assets не включая их в ресурсы.
0
 Аватар для Wladimir2003
0 / 0 / 0
Регистрация: 27.11.2020
Сообщений: 83
28.06.2022, 16:19  [ТС]
Проблема была в неправильном сопоставлении таблиц в БД и в самой программе. Код на скриншоте работает, новую таблицу создавал другой фрагмент кода, который и должен был этим заниматься, если нужной таблицы не было. Отсюда складывалось впечатление, что не работает код подключения к БД.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.06.2022, 16:19
Помогаю со студенческими работами здесь

Выдает ошибку файл не найден
Хотел просто создать файл, но выдает ошибку файл не найден #include <iostream> #include <ctime> #include <stdio.h> ...

Исходный код не найден C++ (xmemory не найден, исключение не обработано)
Имеется самый простой код SFML для создания окна произвольного размера. При запуске отладки возникает сообщение: "Необработанное...

Проблема с кодом. Выдает ошибку, я не могу понять в чем проблема
Работаю первый раз с Maple. Установлен версии 2015 года. Выдает ошибку я не могу понять в чем проблема Вот код: restart: ...

При запуске службы сервер выдает сообщение ошибка 2: Файл не найден
Persk, У меня при запуске службы выдает сообщение ошибка 2: Файл не найден. Как излечить данного пациента? Перестала работать служба...

Jar файл выдаёт исключение
Использую java 1.8 и IntelliJIdea. Для использования программе загружаю шрифт InputStream is1 =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru