PDA

View Full Version : راهنمایی برای توابع مربوط به وجود یک فایل در win7 32bit کار میکنن ولی در win7 64 bit کار نمیکنه!



one hacker alone
پنج شنبه 28 فروردین 1393, 18:48 عصر
با یاد خدا
سلام دوستان
برنامه ای رو قبلا نوشته بودم برای چک کردن اینکه یک فایل وجود داره یا نه که الان وقتی تست کردم متوجه شدم رو ویندوز هفت 64 بیت کار نمیکنه
از متد های مختلفی هم استفاده کردم از جمله توابع api اما باز مشکل وجود داره
در کد زیر دو تا از روش ها رو برای تست انجام دادم ولی کار نمیکنه
خواستم بدونم راه حل چیه


Private Const OF_EXIST As Long = &H4000
Private Const OFS_MAXPATHNAME As Long = 128
Private Const HFILE_ERROR As Long = -1
Private win

Private Type OFSTRUCT
cBytes As Byte
fFixedDisk As Byte
nErrCode As Integer
Reserved1 As Integer
Reserved2 As Integer
szPathName(OFS_MAXPATHNAME) As Byte
End Type
Private Declare Function OpenFile Lib "kernel32" (ByVal lpFileName As String, _
lpReOpenBuff As OFSTRUCT, ByVal wStyle As Long) As Long
Public Function FileExists(ByVal Fname As String) As Boolean
Dim lRetVal As Long
Dim OfSt As OFSTRUCT
lRetVal = OpenFile(Fname, OfSt, OF_EXIST)
If lRetVal <> HFILE_ERROR Then
FileExists = True
Else
FileExists = False
End If
End Function
Private Sub Command1_Click()
win = "c:\windows\"
Dim FileExists
On Error GoTo notexist:
FileExists = GetAttr(win + "help.txt")
If fileesixts = 1 Then MsgBox "found"
End
notexist:
MsgBox "not found"
End Sub

Private Sub Command2_Click()
win = "c:\windows\"
MsgBox FileExists(win + "help.txt")
End Sub

AbbasVB
پنج شنبه 28 فروردین 1393, 19:24 عصر
سلام کد رو به صورت زیر تغییر دادم باید درست کار کنه
ولی این کد همچین حرفه ای نیست ممکنه بعضی وقتا درست عمل نکنه



Option Explicit

Private Const OF_EXIST As Long = &H4000

Private Const OFS_MAXPATHNAME As Long = 128

Private Const HFILE_ERROR As Long = -1

Private Type OFSTRUCT

cBytes As Byte

fFixedDisk As Byte

nErrCode As Integer

Reserved1 As Integer

Reserved2 As Integer

szPathName(OFS_MAXPATHNAME) As Byte

End Type

Private Declare Function OpenFile _
Lib "kernel32" (ByVal lpFileName As String, _
lpReOpenBuff As OFSTRUCT, _
ByVal wStyle As Long) As Long

Public Function FileExists(Fname As String) As Boolean

On Error Resume Next

Dim lRetVal As Long

Dim OfSt As OFSTRUCT

lRetVal = OpenFile(Fname, OfSt, OF_EXIST)

If lRetVal <> HFILE_ERROR Then

FileExists = True

Else

FileExists = False

End If

End Function

Private Sub Command1_Click()

win = "c:\windows\"

On Error GoTo notexist:

If FileExists("c:\windows\help.txt") Then
MsgBox "found"
Else
MsgBox "not found"

End If

End Sub





من این کد رو توصیه می کنم هر چند برای این کار کد زیاده

Option Explicit
Private Declare Function PathFileExists Lib "shlwapi.dll" Alias "PathFileExistsA" (ByVal pszPath As String) As Long

Private Sub Command1_Click()
If CBool(PathFileExists("c:\windows\Help.txt")) Then
MsgBox "True"
Else
MsgBox "False"
End If
End Sub

one hacker alone
پنج شنبه 28 فروردین 1393, 20:39 عصر
ممنون ولی این هم کار نکرد
نکته ی جالب اینه که اگه همین فایل رو در مسیر system32 بزاریم قضیه تشدید پیدا میکنه چون تو سیستم های 64 بیت مسیر معادل میشه SysWOW64
دوستان اگه کسی کدی داره که حس میکنه درسته تو مسیر system32 تستش کنه
ممنون

سید حمید حق پرست
پنج شنبه 28 فروردین 1393, 22:03 عصر
سلام علیکم
با دستور زیر هم میشه :
Private Sub Command1_Click()
If Dir("C:\test.txt") = "" Then
MsgBox "No"
Else
MsgBox "Yes"
End If
End Sub
موفق باشید.

یا علی (ع)

one hacker alone
پنج شنبه 28 فروردین 1393, 23:37 عصر
بله این هم یکی از روش های چک کردن وجود یک فایل هست اما مشکل با 64bit داریم هنوز

AbbasVB
پنج شنبه 28 فروردین 1393, 23:58 عصر
دوست عزیز این فایل چه طوری ایجاد میشه؟
برنامه خودتون اون رو میسازه یا برنامه دیگه؟
خوب شما چک کن ببین فایل واقعا توی کدوم پوشه است توی System32 یا SysWOW64
بعد چک کن اگر سیستم 64 بیت بود اون پوشه رو بررسی کن
اگر 32 بیت بود که توی همون System32 خواهد
من الان امتحان کردن توی SysWOW64 یه فایل بود ولی از هر دو مسیر درست بر می گردوند

one hacker alone
جمعه 29 فروردین 1393, 02:30 صبح
بله اگه ما فایلمون در مسیر SysWOW64 باشه درست کار میکنه یعنی همون system32 در واقع در معماری جدید مایکروسافت توسط یک dll ریدایرکت میشه و این قضیه فعلا تنها جوابی هست که مایکروسافت داده اما من نمیخواستم کدم رو به این شکل در بیارم ولی ظاهرا چاره ای نیست و قبلش باید معماری سیستم رو مشخص کرد و رفتار برنامه بر اساس اون تنظیم بشه
ممنون