PDA

View Full Version : خطاي I/o error 104 گاهي فايل رو ميخونه و گاهي خير



سوگند رها
شنبه 06 تیر 1388, 14:00 عصر
با سلام خدمت دوستان
در برنامه اي تعدادي فايل را از يك دايركتوري ليست باكس انتخاب كرده و به يك ليست باكس انتقال مي دهم سپس از ابتداي ليست باكس تا انتهاي آن يكي يكي نام فايل ها را انتخاب كرده و براي خواندن باز مي كنم .
حال مشكل بوجود آمده اينست كه در برخي اوقات با پيغام "I/O ERROR 104" >مواجه مي شوم
در صورتي كه همين فايل را قبلا باز كرده وهيچ خطائي نداشته است و يا تعدادي از فايل ها بدون خطا باز مي شوند و تعدادي ديگر با خطا مواجه مي گردند .

كد اين قسمت از برنامه بصورت زير است

for x:=1 to ListBox1.Count do
begin
mainform.Refresh
selectname:=ListBox1.Items.Strings[x-1]
AssignFile(tempfile,selectname
try
Reset(tempfile
Except On E: EInOutError do
ShowMessage('file not exit
end

vcldeveloper
شنبه 06 تیر 1388, 18:29 عصر
چرا از AssignFile و Reset استفاده می کنید؟ اینها توابع بسیار قدیمی مربوط به پاسکال هستند. بهتر هست از TFileStream یا توابع API ویندوز برای کار با فایل ها استفاده کنید. در ضمن، مشخص نکردید که فایل را باز می کنید که بعدا باهاش چیکار کنید؟

سوگند رها
یک شنبه 07 تیر 1388, 07:40 صبح
ممنون از پاسختون
هر يك از فايل ها داراي ركورد هاي رشته اي است . برنامه فايل را باز كرده و از ابتدا فايل تا انتهاي آن هر ركورد را از فايل مي خواند و بر اساس نياز رشته را تفكيك كرده و در بانك اطلاعاتي ذخيره مي نمايد.

مي خواستم از stream استفاده كنم ولي چون stream بيت به بيت مي خواند و جلو مي رود و من نياز دارم فايلم رو ركورد به ركورد بخونم . شايد بگين خب سايز رو در هر بار تعيين كن . ولي چون اولين ركورد از هر فايل با مابقي ركورد ها داراي سايز متفاوتي مي باشد ترجيح دادم براي راحتي كار از reset استفاده كنم
while not Eof(tempfile) do
begin
Readln(tempfile,st
if i=0 then
he:=st
else
separate(st,he,namebank,selectname
i:=1
end
سايز رشته اول 30 كاركتر و سايز مابقي رشته ها 46 كاراكتر

vcldeveloper
یک شنبه 07 تیر 1388, 10:58 صبح
این خطا به خودی خود یعنی فایل مورد نظر برای خواندن باز نشده. حالا اینکه چه اتفاقاتی میافته که فایلی که شما تصور می کنید باز شده، از نظر دلفی هنوز باز نشده، بستگی به مابقی کدتان داره که اینجا نیست.

اگر میدونید که رکوردها با چه کارکتر یا کارکترهایی از هم تفکیک شدند، بهتر هست از TStringList استفاده کنید. اگر فقط با یک کارکتر از هم تفکیک شدند، کافی هست آن کارکتر را به خصوصیت Delimiter مربوط به TStringList اختصاص بدید، تا خودش کار تفکیک رکوردها از هم و قرار دادن هر رکورد در لیست را انجام بده، در اینصورت میتونید به همان شکلی که به Itemهای ListBox دسترسی دارید، به رکوردهای فایلتان هم دسترسی داشته باشید.
اگر تعداد کارکترهای تفکیک کننده هر رکورد بیش از یک کارکتر هست هم همچنان می تونید از TStringList استفاده کنید، البته این بار باید خودتان با استفاده از توابعی مثل Pos یا PosEx شروع و پایان هر رکورد را مشخص کنید.

hamidele
یک شنبه 07 تیر 1388, 21:43 عصر
مطلب خاصی نمی خواستم بگم. فقط یه تذکر کوچولو:
وقتی از reset استفاده می کنید حتما در ادامه ی برنامه از Close file استفاده کنید تا در اجرای بعدی برنامه تان همه ی فایل های مورد نظر قابل reset شدن باشند و اگر در زمان اجرای برنامه ، debug کردید ، فایل هایی که بسته نشدند را به صورت دستی(مثلا با لوگ آف شدن) ببندید.