Страница: 1 |
Страница: 1 |
Вопрос: узнать открыт файл или нет
Добавлено: 09.03.07 18:51
Автор вопроса: Георгич
Как программно узнать открыт файл или нет?
Ответы
Всего ответов: 11
Номер ответа: 1
Автор ответа:
Viper
ICQ: 249094859
Вопросов: 0
Ответов: 310
Профиль | | #1
Добавлено: 10.03.07 08:27
Чей файл, для чего узнать, короче критериев много. Описывай конкретную ситуацию, а то решений тут великое множество от просто попробовать открыть до похода в ядро для получения инфы о хэндлах.
Номер ответа: 2
Автор ответа:
Георгич
Вопросов: 16
Ответов: 52
Профиль | | #2
Добавлено: 10.03.07 18:02
Первоначально, была проблема с шифрованием , ключ шифрования создан на основе пароля, когда вводишь правильный пароль проблем нет , а когда неверный выбрасывается исключение, после которого, если вводить опять пароль(правильный или не правильный), то выбрасывается опять исключение которое говорит о том , что файл для дешифровки открыт и соответственно доступа к нему нет. Я и хотел вставить в обработчик ошибок , фразу типа « Если файл С:\Тест.txt открыт , закрой его» Но вспомнил, что есть оператор Finally и файл закрываю там. Всё проблем нет с неверным паролем. Но вопрос остался. Как, например в своей проге написать « Если файл С:\Тест.txt открыт, закрой его» или « Если файл С:\Тест.txt открыт, верни True»
Номер ответа: 3
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #3
Добавлено: 10.03.07 18:13
Очень похоже на неверное проектирвание.
Файл открывается в пределах программы? Зачем же держать его все время открытым?
Вобщем ничего разумного я не понял.
Номер ответа: 4
Автор ответа:
Георгич
Вопросов: 16
Ответов: 52
Профиль | | #4
Добавлено: 10.03.07 22:49
Может я запутанно как-то написал, откинем всё про шифрование и предположим такую ситуацию, я в ручную открыл файл С:\Тест.txt свернул окно и забыл про него, потом в своей проге обращаюсь к этому же (открытому) файлу, чтоб не выскочило исключение как программно мне его закрыть, так сказать на опережение ?
Номер ответа: 5
Автор ответа:
Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #5
Добавлено: 11.03.07 21:22
заведомо неверный подход, мне кажется. Если файл и необходимо держать открытым (ну типа чтоб в него никто гряными лапами не лазил или не удалил), то весь доступ внутри программы к этому файлу должен обеспечиваться посредством класса, который будет открывать файл, если он закрыт и просто работать с ним, если он уже открыт.
А вообще конечно, если позволяет логика программы, не держать файл открытым. Чтобы обезопасить себя от всех случайных "незакрытий" внутри процедур, открывай файл используя using'и (ты ведь с файловыми потоками работаешь?) тогда вне зависимости от того вылетело ли исключение или нет, при выходе из блока using экземпляр будет разрушен и файл закроется.
Номер ответа: 6
Автор ответа:
Георгич
Вопросов: 16
Ответов: 52
Профиль | | #6
Добавлено: 12.03.07 08:59
Да с потоками я, работая, а вот что такое блок using не знаю, если можно пару строк кода для примера ,чтобы понять про что речь
Номер ответа: 7
Автор ответа:
Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #7
Добавлено: 12.03.07 10:14
Вот простынка из того, что сейчас лабаю.
private void Head_Load(object sender, EventArgs e)
{
try
{
using (OracleConnection conn = new OracleConnection(GetConnectionString))
{
conn.Open();
using (OracleTransaction tran = conn.BeginTransaction())
{
string insert_row_text = "BEGIN TECH.PSERVICE_CENTER.INSERT_ROW (IN_SERVICE_CENTER_TYPE_ID => :IN_SERVICE_CENTER_TYPE_ID,IN_NODE_ID => :IN_NODE_ID,IN_NAME => :IN_NAME,IN_NOTE => :IN_NOTE,IN_VISIBLE => :IN_VISIBLE,IN_ID => :IN_ID,OUT_ID => :OUT_ID); END;";
using (OracleCommand cmd_ins = new OracleCommand(insert_row_text, tran.Connection))
{
OracleParameter prmInsServCenterId = cmd_ins.Parameters.Add("IN_SERVICE_CENTER_TYPE_ID", OracleType.Number);
OracleParameter prmInsNodeId = cmd_ins.Parameters.Add("IN_NODE_ID", OracleType.Number);
OracleParameter prmInsName = cmd_ins.Parameters.Add("IN_NAME", OracleType.VarChar);
OracleParameter prmInsNote = cmd_ins.Parameters.Add("IN_NOTE", OracleType.VarChar);
OracleParameter prmInsVisible = cmd_ins.Parameters.Add("IN_VISIBLE", OracleType.Number);
OracleParameter prmInsInId = cmd_ins.Parameters.Add("IN_ID", OracleType.Number);
OracleParameter prmInsOutId = cmd_ins.Parameters.Add("OUT_ID", OracleType.Number);
prmInsOutId.Direction = ParameterDirection.Output;
cmd_ins.Transaction = tran;
try
{
using (OracleCommand cmd_check = new OracleCommand("select count(*) from tech.service_center where service_center_type_id=4 and node_id=:NODE_ID", tran.Connection))
{
cmd_check.Transaction = tran;
OracleParameter prmChkNodeId = cmd_check.Parameters.Add("NODE_ID", OracleType.Number);
using (DataTable tbl = new DataTable())
{
using (OracleDataAdapter adap = new OracleDataAdapter("", tran.Connection))
{
adap.SelectCommand.Transaction = tran;
adap.SelectCommand.CommandText = "select sc.id sc_id,sc.node_id,t.name town_name " +
"from tech.service_center sc,tech.node n,db.town t " +
"where sc.node_id=n.id and n.town_id=t.id " +
"and sc.service_center_type_id=4 " +
"and sc.id<=2206 " +
"order by sc.id, sc.node_id";
adap.Fill(tbl);
}
foreach (DataRow row in tbl.Rows)
{
prmChkNodeId.Value = row["node_id"];
if (Convert.ToInt32(cmd_check.ExecuteScalar()) == 1)
{
System.Diagnostics.Debug.WriteLine("Будем работать с " + row["town_name"].ToString());
prmInsServCenterId.Value = 4;
prmInsNodeId.Value = row["node_id"];
prmInsNote.Value = "";
prmInsVisible.Value = 1;
prmInsName.Value = "New рабочее место";
prmInsInId.Value = DBNull.Value;
prmInsOutId.Value = DBNull.Value;
cmd_ins.ExecuteNonQuery();
//prmInsName.Value =
}
}
}
}
//tran.Commit();
}
catch (Exception ex)
{
tran.Rollback();
throw ex;
}
}
}
}
}
catch (Exception ex)
{
throw ex;
}
}
Благодаря юсингам можно не беспокоится, что коннект останется открытым, всё замечательно уничтожается вне зависимости от поведения кода. И все прочие ресурсы (таблицы, адаптеры, команды) уничтожаются самым естественным образом - внутри тех процедур, где они были созданы.
Я совсем недавно начал ими пользоваться (кстати, тоже здесь подсказали), а до этого пытался лепить Dispose в Finally, но не работало не фига (когда эксепшн выталкиваешь finally не срабатывает), поэтому на данный момент у меня юсинги рулят.
Номер ответа: 8
Автор ответа:
Георгич
Вопросов: 16
Ответов: 52
Профиль | | #8
Добавлено: 12.03.07 17:37
Спасибо за пример, но он мне не помог т.к я пишу на VB.Net , а вот «С» мне не знаком , судя по описанию using весьма полезен, раз даёт такую возможность на уничтожение, интересно в Net как это сделать?
Номер ответа: 9
Автор ответа:
Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #9
Добавлено: 12.03.07 18:45
Это C# - тоже дотнет. И синтаксис на VB у этого оператора абсолютно такой же.
using f_strm as new filestream(file_name,filemode.open,fileacess.read)
f_strm.open()
end using
Номер ответа: 10
Автор ответа:
Георгич
Вопросов: 16
Ответов: 52
Профиль | | #10
Добавлено: 12.03.07 22:04
Понял, но наверно и это мне не поможет, хотя точно не знаю, я пересмотрел свою литературу ни слова о юсингах и по справке даёт 500 ссылок, но всё не то, скорей всего в VB.Net 2003 , а я всё ещё пишу в нём, этого нет. Если VB.Net 2003 using есть, подскажи где, мне прочитать в справочнике. Заранее спасибо.
Номер ответа: 11
Автор ответа:
Viper
ICQ: 249094859
Вопросов: 0
Ответов: 310
Профиль | | #11
Добавлено: 13.03.07 10:10
в 2003 этого нет