يمكن إنشاء ملف واحد () فتح ملف واحد في نفس الوقت في موضوعين مختلفين
-
21-09-2019 - |
سؤال
يمكن إنشاء ملف واحد () فتح ملف واحد في نفس الوقت في موضوعين مختلفين
void new_function(void * what)
{
HANDLE h = CreateFile("c:\\tmp", GENERIC_ALL,FILE_SHARE_WRITE |
FILE_SHARE_READ , NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (h == INVALID_HANDLE_VALUE)
{
DWORD d = GetLastError();
return ;
}
Sleep(10000);
}
int main()
{
HANDLE h = CreateFile("c:\\tmp", GENERIC_ALL,FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
Sleep(10000);
return 1;
}
في كل مرة يخرج في GetLastError
موقع. والخطأ ERROR_SHARING_VIOLATION
(32 ، "لا يمكن للعملية الوصول إلى الملف لأنه يتم استخدامه بواسطة عملية أخرى.")
إذا شاركت في فتح الملف ، فما هو استخدام FILE_SHARE_WRITE | FILE_SHARE_READ
شكرا
The program environment is Win32 Vs2003
المحلول
مقبض الملف هو دائماً مشترك بين المواضيع. كل ما ستحتاج إلى القيام به هو مجرد استخدام المقبض كالمعتاد ، ولكن على خيوطين.
مكالمتك الثانية إلى CreateFile()
تفشل لأنك تطلب المزيد من الوصول ، GENERIC_ALL
, ، مما تسمح بالوصول المشترك ، FILE_SHARE_WRITE | FILE_SHARE_READ
.
إذا طلبت بدلاً من ذلك فقط GENERIC_READ | GENERIC_WRITE
, ، سوف ينجح.
ال CreateFile()
سيكون السلوك هو نفسه إذا اتصلت به على موضوع واحد.