|
Hello.. I am triyng to make a windowsProgram which is like the "search" in windows.. But I don't know where to start? First determine the directories..But how? For example I need to find every directory in C drive and their subfolders ..Then I need to find every text file in that folders and then look for my word.. So anyone any idea how to do that? I found something "directorySearcher" can this be a starting point?
Thanks for advice
Revelation 22:13
|
|
|
|
|
If you read the documentation[^] for the DirectorySearcher class, it reads, "Performs queries against Active Directory." It's for querying Active Directory which is a networking layer, to put it basically. It won't help you.
You'll have to recursively search directories and open files as you stated. This is very expensive, however, and you should consider indexing files instead. You could rely on Windows Desktop Search, which exposes an API[^]. There's lots of other tools out there you can use like Indexing Service, which comes installed in Windows (originally by default, but now you have to install it explicitly but it's a component on the CD/installation media). There's lots and lots of other libraries out there as well.
Indexing only has to traverse files once (and will typically re-index changed or new files). The index is queried and files are returned. This is how web search engines work, too.
If you want to use the slow and expensive recursive search there are several articles available here on Code Project how to do that. Look at the examples in the search http://www.codeproject.com/info/search.asp?cats=2&cats=3&cats=5&cats=6&searchkw=recursive+directory+search[^].
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Customer Product-lifecycle Experience
Microsoft
[My Articles] [My Blog]
|
|
|
|
|
|
I realized the sad fact, that there's no FolderTreeView control on .NET, just a dialog, so I've created my own based on browsing capabilities of the TreeView. It works fine despite fact there are no such beautiful icons like in explorer and root nodes are drives, not the Desktop...
It's OK, but now I'm looking for a way how to deal with network drives, shared folders etc. In Explorer, there's just some "Network Neighborhood", but I'm using ManagementObjectCollection to obtain logical drives. What do I need to enlist network drives such as shared folders?
Thanks in advance.
|
|
|
|
|
Enumerating shell namespaces (which is actually what they're called; some namespaces just happen to be drives while others are mapped drives, etc.) includes a lot of complicated calls (relatively speaking). There's no simple solution to what you want to do. To do this correctly WMI isn't the best solution. Instead you need to use the Shell interfaces which return you namespaces and allow you to query for their icons along with many other things. Doing this doesn't work with paths at all, but item ID lists (IDLs) of objects. Folders and files have unique IDs. The control panel has a unique ID, etc. Everything visible in the shell namespace has a unique ID. See Navigating the Namespace[^] for an overview with links and a sample in native code.
Another problem is that since all these interfaces are native you'll need to create RCWs (runtime-callable wrappers) for several dozen interfaces, define lots of constants (you'll need the C/C++ headers in the Platform SDK[^] - also installed with Visual C++ - for values), and define lots and lots of structures - some of which aren't so easy because of unions which don't have an equivalent representation in .NET. Because of this you might consider writing such a control in Managed C++ - which allows you access to native constructs but compiled to managed code (the resulting assembly is actually a mix of native and managed code, which means the assembly isn't verifiable and won't run in some security contexts like from an Internet or intranet site).
The article http://www.codeproject.com/csharp/csdoesshell1.asp[^] on this site will give you a start. You can find other articles about shell namespace extensions in the search results at http://www.codeproject.com/info/search.asp?cats=2&cats=3&cats=4&cats=5&cats=6&searchkw=IShellFolder[^].
You can find some commercial solutions at http://www.windowsforms.net/ControlGallery/default.aspx?Category=29&tabindex=10[^]. It takes a lot of work to write these correctly and the prices for some of these controls is a very good deal (no royalties, either). If you're developing this on a budget you might find using one of these cheaper controls may be cheaper than the cost of resources to write it yourself. Just a suggestion to consider. This is a daunting task, though not impossible. The articles above should give you some idea about enumerating the shell and handling IDLs. With that you can query for other interfaces to get the icons you're desiring.
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Customer Product-lifecycle Experience
Microsoft
[My Articles] [My Blog]
|
|
|
|
|
Hi peoeple,
i originly was working with VS.Net 2003 and i use WINXP.
when i tried to run my package on win 98 (installed the Framework 1.1) , it caused an Exception.
do i need to copy dll file along with my package?
my dll definitions:
<br />
[DllImport("user32.dll",CharSet=CharSet.Auto,<br />
CallingConvention=CallingConvention.StdCall)]<br />
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn,IntPtr hInstance, int threadId);
my use in the code is :
KeyboardHookProcedure = new HookProc(KeyboardHookProc);<br />
hKeyboardHook = SetWindowsHookEx( WH_KEYBOARD_LL,KeyboardHookProcedure,Marshal.GetHINSTANCE( Assembly.GetExecutingAssembly().GetModules()[0]),0);<br />
Please Help.
Thanks alot,
Ran.
-- modified at 17:43 Tuesday 24th January, 2006
|
|
|
|
|
1. You should use Assembly.ManifestModule (at least with assemblies containing a single module) instead of the first entry in Assembly.GetModules() .
2. You should declare P/Invoke methods as private and expose them through wrapped classes. P/Invoke is dangerous and you should make sure that you handle all inputs from potential unknown and malicious callers. This leads into my next point.
3. You should declare the P/Invoke methods with SetLastError=true . If an error occurs, call Marshal.GetLastWin32Error and let us know what the actual error is. Without that, all one can know is an error occured (which you already know). Wrapper this method would allow you to do that and throw a Win32Exception (or any exception - this is just an example) with the last error as reported by Windows (so the exception is more actionable).
There are several good articles here on Code Project that may help shed some light on what might be wrong. Just search for "SetWindowsHookEx".
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Customer Product-lifecycle Experience
Microsoft
[My Articles] [My Blog]
|
|
|
|
|
|
All that says at the bottom is that to use the Unicode version of the function (NT supports Unicode and ANSI, while Win9x only supports ANSI) you have to use a shim named unicows.dll. You needn't worry about this since you're using CharSet.Auto . You need to figure out what the error is, though. See my paragraph about using Marshal.GetLastWin32Error() .
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Customer Product-lifecycle Experience
Microsoft
[My Articles] [My Blog]
|
|
|
|
|
sorry to bother you again but i realy dont understand what you mean.
i was looking for a method named ManifestModule and i didnt fint it.
and i also dont know what is P/Invoke
Can you help me?
Ran.
R.Z
|
|
|
|
|
Assembly.ManifestModule is new in .NET 2.0, so if you're not programming against .NET 2.0 you won't have it.
P/Invoke is the act of calling native functions in .NET. It's what you call defining methods attributed with DllImportAttribute like you're doing.
Please add code to call Marshal.GetLastWin32Error and report what the error is on Win9x. The fact that 0 is returned simply means an error occured but there are many errors that could have occured and without knowing which one it's impossible to help you further.
I would also suggest looking for articles here on Code Project that use SetWindowsHookEx . Sample code works on both 9x and NT at least for the ones I have tested (some time back when I was an editor).
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Customer Product-lifecycle Experience
Microsoft
[My Articles] [My Blog]
|
|
|
|
|
well i've changed the public to private like you said.
now i put this line before throwing the exception:
MessageBox.Show(Marshal.GetLastWin32Error().ToString());
that will show me the error number i guess.
and wrote : SetLastError=true
run it on the win98 and it gives me the number 127.
what that means? did i win anything ?
R.Z
|
|
|
|
|
If you lookup error 127 in winerror.h (available with VC++ that may be installed with your VS install, and online on http://msdn.microsoft.com[^]) you'll see that the error is ERROR_PROC_NOT_FOUND , which translates to the English text, "The specified procedure could not be found." I would recommend taking a look at http://msdn.microsoft.com/msdnmag/issues/02/10/cuttingedge/[^].
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Customer Product-lifecycle Experience
Microsoft
[My Articles] [My Blog]
|
|
|
|
|
well, its generaly nice but it doesn't help regarding win98.
i have allready succesfuly using Hooking but i just want to make sure the client can run it too.
in Microsoft they say:
WH_KEYBOARD
Installs a hook procedure that monitors keystroke messages. For more information, see the KeyboardProc hook procedure.
WH_KEYBOARD_LL
Windows NT/2000/XP: Installs a hook procedure that monitors low-level keyboard input events. For more information, see the LowLevelKeyboardProc hook procedure.
is it posible that the WH_KEYBOARD_LL is only on XP and not win98?
R.Z
|
|
|
|
|
Yeah, the WH_KEYBOARD_LL hook is only available in NT4.0 SP3 and above. Windows 9x is not supported.
Hey Heath! How's it going in Redmond?
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
Hi Dave,
so how can i get KeyUp/Pressed/Down , MouseClick events on using .net on 98?
Thanks,
Ran.
R.Z
|
|
|
|
|
You can use WH_KEYBOARD and WH_MOUSE . These will give you the scan codes for keys pressed and mouse messages like move, click, etc., respectively. The article I linked shows an example and other articles on this site have further examples. I encourage you to use the other features of this web site. There's thousands of articles at your disposable with a rating system in place so you know which ones are good.
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Customer Product-lifecycle Experience
Microsoft
[My Articles] [My Blog]
|
|
|
|
|
Is it possible to change the DefaultValue attribute for a property for a derived class without having to re-define the whole property?
|
|
|
|
|
It actually depends on how you plan to use it. Normally, yes, you would have to override the property and attribute it with a different value for the DefaultValueAttribute constructor.
If the object is only to be used with Component Model clients (like the PropertyGrid ) you can implement ICustomTypeDescritor and when a PropertyDescriptor is requested for the property you can return a custom implementation that returns a different instance of DefaultValueAttribute from the PropertyDescriptor.Attributes . See the documentation for ICustomTypeDescriptor for more details. You can return the default implementation for most methods you don't need to override using the TypeDescriptor class (corresponding methods to ICustomTypeDescriptor take an additional parameter that basically says not to use any ICustomTypeDescriptor implementation).
Since you care about the DefaultValueAttribute and this is generally used at design-time (though not necessary), you could also implement a custom designer that does essentially what I mentioned above. If this was a Component derivative you would implement a derivative of ComponentDesigner and override PostFilterAttributes .
Generally speaking, though - it's far easier of a change and easier to maintain with less possibility of bugs to just override the property. It could be as easy as the following:
public class MyBase
{
bool _boolProperty = true;
[DefaultValue(true)]
public virtual bool BoolProperty
{
get { return _boolProperty; }
set { _boolProperty = value; }
}
}
public class MyDerivative : MyBase
{
public MyDerivative()
{
BoolProperty = false;
}
[DefaultValue(false)]
public override bool BoolProperty
{
get { return base.BoolProperty; }
set { base.BoolProperty = value; }
}
} See, there's nothing really to implement - just set the member of the base class. Many classes within the .NET Framework base class library do this when necessary. It's just a cleaner design and doesn't depend on callers having to implement or use rather difficult interfaces.
This posting is provided "AS IS" with no warranties, and confers no rights.
Software Design Engineer
Developer Division Customer Product-lifecycle Experience
Microsoft
[My Articles] [My Blog]
|
|
|
|
|
Hi!
I have a hashtable and add values from time to time like this:
users.Add("Bob", 4);
users.Add("John", 10);
Now I want each entry I add into this list to be removed after a certain amount of time, e.g. 10 minutes.
So I add "Bob", and Bob will be autoamtically removed from the hashtable after 10 minutes, same for John.
What is the best way to do this?
regards
modified 12-Sep-18 21:01pm.
|
|
|
|
|
Run a clean-up function off a timer that scans the list for items older than 10 minutes, and deletes them. You'll have to keep track of how old an item is, of course. How you do that is really up to you, but I'd make the "value" portion of the table entry actually a class instance that holds your useful data plus a DateTime value.
|
|
|
|
|
It thought about that idea too, but found it a bit unflexible. But when there's no other way that's how I will do it.
regards
modified 12-Sep-18 21:01pm.
|
|
|
|
|
I think the System.Web.Caching.Cache class is what are you looking for ...
You can use it in WinForms application as shown below:
<br />
using System.Threading;<br />
using System.Web;<br />
using System.Web.Caching;<br />
<br />
namespace WindowsApplication8<br />
{<br />
public sealed class WinCache<br />
{<br />
private static HttpRuntime _httpRuntime;<br />
<br />
public static Cache Cache<br />
{<br />
get<br />
{<br />
EnsureHttpRuntime();<br />
return HttpRuntime.Cache;<br />
}<br />
}<br />
<br />
private static void EnsureHttpRuntime()<br />
{<br />
if( null == _httpRuntime )<br />
{<br />
try<br />
{<br />
Monitor.Enter( typeof( WinCache ) );<br />
if( null == _httpRuntime )<br />
{<br />
_httpRuntime = new HttpRuntime();<br />
}<br />
}<br />
finally<br />
{<br />
Monitor.Exit( typeof( WinCache ) );<br />
}<br />
}<br />
}<br />
}<br />
}<br />
<br />
Then you can easily insert the values into WinCache in following way:
<br />
WinCache.Cache.Insert("Bob", 4, null, DateTime.Now.AddMinutes(10), TimeSpan.Zero);<br />
WinCache.Cache.Insert("John", 10, null, DateTime.Now.AddMinutes(10), TimeSpan.Zero);<br />
DevIntelligence.com - My blog for .Net Developers
-- modified at 17:31 Tuesday 24th January, 2006
|
|
|
|
|
tarasn wrote: I think the System.Web.Caching.Cache class is what are you looking for ...
You can use it in WinForms application as shown below:
I'm not sure if you should be applauded for code reuse or censored for abusing existing code into a place where it has no business being. (mainly because I don't know anything about the web classes)
|
|
|
|
|
I don't see any problem with my answer .You can create Console application and check the code that I sent .Instead reinventing the wheel ( and wasting the time ) you can use well implemented class .I highly recommend you read more on MSDN about Cache class - probably it solves your .Net problem too .
DevIntelligence.com - My blog for .Net Developers
|
|
|
|