• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Вопрос по Assignfile

  • Автор темы Guest
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest

Поиогите чё та не знаю чё делать!

Пишу
AssignFile(имя,'C:\...\'+F+'.txt'); (F это переменая в которой хранится имя файла)
Rewrite(имя);вот сюда ссылается

А если убираю перененую F из пути 'C:\...\1.txt'); тогда всё ок

В чём дело? Подскажите!
 
M

morpheus

Для: Дрон
и чему же равна переменная F
 
G

Guest

Эта переменая преобразуется путём не сложного отбора из стрики переданой по сети через сокет!
Строка полученая из сокета AnsiString
 
B

Barmutik

Залогируйте какое значение в неё приходит...
 
G

Guest

Извините конечно что я сразу весь код выложил! Просто что сразу было видно где и что и что я хочу осуществить! Бууду очень благодарен за помощь!
Напомню что проблема состоит в том что файл не создаётся! Ругается на команду Rewrite!
А вот если я убираю переменую F то всё ок!

Код:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
za,S1,S2: AnsiString;
z: Integer;
begin
S1 := Socket.ReceiveText; {Присваиваем S1 полученную строку из Socket}
za:=''; //Эта переменая служит для определения таблицы в которую нужно записать пришедшие данные
z := 0;
za:= Copy(S1, 1, 1);
Delete(S1, 1, 1 + Length(Delitel) - 1);
IF za='1' then
begin
DBNavigator1.BtnClick(nbInsert);
DBNavigator1.BtnClick(nbEdit);
end
else
begin
DBNavigator2.BtnClick(nbInsert);
DBNavigator2.BtnClick(nbEdit);
end;
repeat {Разделяем строку, если одновременно пришло несколько}
z := Pos(Delitel, S1); {Ищем раздлелитель Delitel в строке S1}
if z <> 0 then {Если найден делитель, тогда ...
Если не найден, то вы не добавили в конце отсылаемой строки Delitel !}
begin
S2 := Copy(S1, 1, z - 1); {Копируем одну пришедшую строку в S2}
Delete(S1, 1, z + Length(Delitel) - 1); {Удаляем уже скопированную строку}
If za='1'then Table1.Fields.Fields[j].Text:=S2
else
begin
If j=0 then F:=S2;
If j<=5 then Table2.Fields.Fields[j].Text:=S2 else Memo1.Lines.Add(S2);
end;
j:=j+1;
{Вызываем процедуру обработки полученных строк,
где S2 наша выделенная строка}
end;
until z = 0; {Повторять, пока будет не найден разделитель Delitel}
IF za='1' then DBNavigator1.BtnClick(nbPost) else DBNavigator2.BtnClick(nbPost);
[b]IF za='2' then 
begin
AssignFile(outfile, 'C:\Test\Архив\'+F+'.txt');
ReWrite(outfile);
Writeln(outfile,str);
CloseFile(outfile); 
end;[/b]
j:=0;
end;
Const
Delitel: string = #13#10; ЭТО делитель!

В команде ошибка извините там нужно
Writeln(outfile,Memo1.Text);
 
S

Silver Wind

1. Где описание переменной outfile?
2. В приведенном коде нет ни описания переменной F, ни присваивания ей какого-либо значения.
 
G

Guest

If j=0 then F:=S2;

Вот присваевание !

А описание переменой F:string;
outfile:textfile;
 
S

Silver Wind

<!--QuoteBegin-Дрон+19:10:2007, 12:23 -->
<span class="vbquote">(Дрон @ 19:10:2007, 12:23 )</span><!--QuoteEBegin-->If j=0 then F:=S2;
[snapback]82346" rel="nofollow" target="_blank[/snapback]​
[/quote]

Не заметил, но всеравно не айс, где инициализация переменнной F? Если If j=0 then F:=S2; так ни разу и не выполнится, то вобще говоря непонятно что там будет, поскольку переменная походу глобальная (в этой процедуре я ее описания не вижу).

А вообще просто ставишь точку останова на эту строчку и проверяешь в отладчике что там твориться.
 
G

Guest

А что есть различие в действии переменой глобальная или локальная она?

Через отладчик не пробовал! Пробовал сообщением выводить переменую F там всё нормально F равно
тому что нужно, а всё равно на Rewrite ругается!

Как я тока не пробовал и Pansichar писал всё равно не хочет

AssignFile(outfile,PansiChar('C:\Test\Архив\'+F+'.txt'));
 
S

Silver Wind

<!--QuoteBegin-Дрон+19:10:2007, 20:08 -->
<span class="vbquote">(Дрон @ 19:10:2007, 20:08 )</span><!--QuoteEBegin-->А что есть различие в действии переменой глобальная или локальная она?
[snapback]82420" rel="nofollow" target="_blank[/snapback]​
[/quote]
Речь о том, что если она глобальная и используется где-то еще, то в момент вызова этой процедурки в ней может оказаться какой-то мусор, и если кусок кода в котором есть присваивание ей нового значения не выполниться, а это вполне возможно, то этот мусор попадет в название файла.

<!--QuoteBegin-Дрон+19:10:2007, 20:08 -->
<span class="vbquote">(Дрон @ 19:10:2007, 20:08 )</span><!--QuoteEBegin-->Через отладчик не пробовал!
[snapback]82420" rel="nofollow" target="_blank[/snapback]​
[/quote]
:)
А ведь именно на это Вам намекают с первого же ответа. Зачем тогда вобще отладка нужна?

А насчет типа переменной, если она и вправду string, то никакого шаманства со строковыми типами не надо.
 
G

Guest

А какой толк через отладчик! Я же через сообщение выводил переменую F и она рвна тому что надо

Да и толадчик мне тоже самое покажит!

Пременая больше ни где не используется!


Примерно хоть подскажите в какую сторону Капать!
 
S

Silver Wind

<!--QuoteBegin-Дрон+20:10:2007, 12:11 -->
<span class="vbquote">(Дрон @ 20:10:2007, 12:11 )</span><!--QuoteEBegin-->Пременая больше ни где не используется!
[snapback]82475" rel="nofollow" target="_blank[/snapback]​
[/quote]
Тогда всеже порекомендую переменные F и outfile сделать локальными.

Если ругается на Rewrite, то может и не в имени файла проблема, а, например, в доступе к файлу. Не может оказаться что ты его уже где-то в программе открыл? Какая именно ошибка возникает? Попробуй так:
Код:
AssignFile(outfile, 'C:\Test\Архив\'+F+'.txt');
{$I-}
ReWrite(outfile);
{$I+}
ShowMessage('Ошибка #'+IntToStr(IOResult));
И по полученному коду ошибки посмотри в чем проблема.
 
G

Guest

Я файл больше в программе не открывал. Ошибка возникает при создании файла. I/O#123. Наверное не может записать данные.

Нашёл другой выход, файл создаётся без имени.
 
P

Pasha

Для: Дрон
Т.е. без имени создается, а с именем нет? Может у тебя места на диске не хватает, чтобы имя файла записать 0.o
А если серьезно - попробовал бы хоть MessageBox-ом выводить строчку 'C:\Test\Архив\'+F+'.txt' перед открытием файла, если отладить не можешь.
 
S

Silver Wind

Код:
F:\Test>net helpmsg 123

Синтаксическая ошибка в имени файла, имени папки или метке тома.

И всетаки проблема у тебя именно с именем файла. Отлаживай программу и проверяй что там за имя получается на самом деле.
 
G

Guest

Для:pasha
я выводил через МessageDlg!!!!Разницы нет!!


Всем спасибо ! Решить эту проблему не смог.

Обошёлся без файла!!
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!